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私は成功しませ"$*", "$@", $*んでした。"$*"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"。これは意味を完全に変更します。

$*通常、すべてのパラメータ(実際のケース)を特定のケースと比較するのではなく、パラメータを繰り返して一度に1つずつ処理します。

"$@"一般的にを代わりに使用したいと思います"$*"。明らかに例外がありますが、非常に珍しいケースです。

おすすめ記事