
私の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つずつ処理します。
"$@"
一般的にを代わりに使用したいと思います"$*"
。明らかに例外がありますが、非常に珍しいケースです。