내 inithome.sh에 다음 코드가 있습니다.
HOMEDIR="/home/$USER/"
descomu () {
case "$*" in
-ut|--user-tar-dir)
TARHOMEDIR= "$2"
if test "$2" = ""
then
echo "The direction can't be empty"
exit
fi
-p|--permissions
descomu -p
;;
esac
if test "$TARHOMEDIR" = ""
then
echo "Direction of tar-home not specified. Use -ut or --user-tar-di r for that."
exit
else
if test "$*" = "-p" || test "$*" = "--permissions"
then
eval "$( tar -xvfp "$TARHOMEDIR" --directory= "$HOMEDIR" )"
if "$?" -eq 0
then
echo "Sucess"
return 0
else
echo "Fail"
return 1
fi
else
eval "$( tar -xvf "$TARHOMEDIR" -C "$HOMEDIR" )"
if test "$?" -eq 0
then
echo "Sucess"
exit
else
echo "Fail"
exit
fi
fi
fi
}
while test $# -gt 0
do
case $1 in
-ru|--recover-user)
descomu "$@"
;;
*)
;;
esac
done
-ut
매개변수 값을 이름이 지정된 변수에 전달 하고 싶지만 $TARHOMEDIR
이렇게 하면 변수가 할당되지 않았다는 ./inithome.sh -ru -ut PATH
플래그가 set -u
표시됩니다 . $TARHOMEDIR
나는 성공 하지 "$*", "$@", $*
못했습니다 ."$*"
case $foo in
나는 그것을 작동시킬 수 있습니다 :
descomu () {
case "$2" in
-ut|--user-tar-dir)
TARHOMEDIR= "$3"
if test "$3" = ""
then
echo "The direction can't be empty"
exit
fi
-p|--permissions
descomu -p
;;
esac
하지만 통과해야만 효과가 있어요하나매개변수가 올바른 위치에 배치되어 있지만 매개변수가 여러 개 있어서 임의의 위치에 배치하고 싶습니다. IFS
변수 에 문제가 있는 걸까요? 그럼 그를 어떻게 선언해야 할까요?
답변1
첫 번째 스크립트에는 문제가 많습니다.
이것은 eval
잘못된 것입니다. tar 명령의 출력을 원하지 않습니다!
$@
모든 함수 에는 호출하는 인수로 구성된 고유한 가 있습니다 . 이는 또한 모든 함수에 고유한 $1
, $2
... 이 있음을 의미합니다.
너~ 해야 하다=
과제에서 기호 주위에는 공백이 없습니다 TARHOMEDIR="$3"
. 이는 의미를 완전히 변경합니다.
$*
일반적 으로 모든 매개변수(실제 사례)를 특정 사례와 비교하는 대신 매개변수를 반복하여 한 번에 하나씩 처리합니다 .
"$@"
일반적으로 를 대신 사용하고 싶습니다 "$*"
. 분명히 예외가 있지만 매우 특이한 경우입니다.