我的 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
变量未分配。我尝试了 with"$*", "$@", $*
和"$*"
incase $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"
- 它完全改变了含义。
通常,您会循环遍历参数并一次处理一个参数,而不是将所有参数(实际情况$*
)与特定情况进行比较。
作为一般规则,您希望使用"$@"
而不是"$*"
.显然也有例外,但它们非常不寻常。