5

私は bash が初めてで、それを学んでいます。 と の使用の実際の違いについて疑問が$@ありS*ます。

私はここで赤いBash Special Parameters

どちらも位置パラメーターに展開されることは理解していますが、違いは二重引用符内で発生します。ちなみに"$@" = "$1" "$2"..."$n"違うかもしれません"S*" = "$1$2...$n".

簡単なスクリプトでそれを理解しようとします:

if [ $# -gt 0 ]; then
       echo "Your command line contains $# arguments" 
else
       echo "Your command line contains no arguments"
       exit  fi

echo "Params are: "
echo $@  
echo $* 
echo "$@"    
echo "$*"

このようにターミナルでスクリプトを実行すると~./my_script par1 par2 par3

結果は常に同じです。

Params are:
par1 par2 par3
par1 par2 par3
par1 par2 par3
par1 par2 par3

特殊変数の実際の使用法と、私の例が正しいかどうかを理解していない可能性があります。この点についても、良い例で考えてみたいと思います。

4

2 に答える 2

4

使用しているときは同じように見える場合がありますがecho、これは、それらが同じように扱われ、echo同等ではないためです。

を使用して、bash スクリプトに指定された 3 つのコマンドライン引数を C プログラムに渡すと ./my_c $@

結果が得られますARGV[1] == "par1" ARGV[2] == "par2" ARGV[3] == "par3"

を使用して、bash スクリプトに指定された 3 つのコマンドライン引数を C プログラムに渡すと./my_c $*

結果が得られますARGV[1] == "par1 par2 par3"

(ARGVは C で提供された引数の配列で、最初の要素は常にプログラムが呼び出されたコマンド名です)

これは、スクリプトの後半で指定されたパラメーターを使用して行うことの柔軟性を高めるためです。

于 2013-07-31T09:55:12.470 に答える
3

http://tldp.org/LDP/abs/html/refcards.htmlから:

"$*" すべての位置パラメータ (1 つの単語として) *

"$@" すべての位置パラメータ (個別の文字列として)

このコードはそれを示しています: アイテムがスペースで区切られた文字列が与えられた場合、$@すべての単語を新しいアイテムと$*見なし、それらをすべてまとめて同じパラメーターと見なします。

echo "Params for: \$@"
for item in "${@}"
do
        echo $item --
done

echo "Params for : \$*"
for item in "${*}"
do
        echo $item --
done

テスト:

$ ./a par1 par2 par3
Your command line contains 3 arguments
Params for: $@
par1 --
par2 --
par3 --
Params for : $*
par1 par2 par3 --
于 2013-07-31T09:50:51.250 に答える