使用 case 语句将参数传递给函数

使用 case 语句将参数传递给函数

我的 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"- 它完全改变了含义。

通常,您会循环遍历参数并一次处理一个参数,而不是将所有参数(实际情况$*)与特定情况进行比较。

作为一般规则,您希望使用"$@"而不是"$*".显然也有例外,但它们非常不寻常。

相关内容