シェルスクリプトで、ドル記号の後にアットマーク(@
)が続くとはどういう意味ですか?
例えば:
umbrella_corp_options $@
$@
は、スクリプトに渡されるパラメーターのallです。
たとえば、./someScript.sh foo bar
を呼び出すと、$@
はfoo bar
と等しくなります。
もしあなたがそうするなら:
./someScript.sh foo bar
そして、someScript.sh
参照内:
umbrella_corp_options "$@"
これは、個々のパラメーターを二重引用符で囲んでumbrella_corp_options
に渡されます。これにより、呼び出し側から空白のあるパラメーターを取得して渡すことができます。
$@
は$*
とほぼ同じで、両方とも「すべてのコマンドライン引数」を意味します。多くの場合、すべての引数を別のプログラムに単純に渡すために使用されます(したがって、他のプログラムの周りにラッパーを形成します)。
2つの構文の違いは、スペースを含む引数(例)があり、$@
を二重引用符で囲むと表示されます。
wrappedProgram "$@"
# ^^^ this is correct and will hand over all arguments in the way
# we received them, i. e. as several arguments, each of them
# containing all the spaces and other uglinesses they have.
wrappedProgram "$*"
# ^^^ this will hand over exactly one argument, containing all
# original arguments, separated by single spaces.
wrappedProgram $*
# ^^^ this will join all arguments by single spaces as well and
# will then split the string as the Shell does on the command
# line, thus it will split an argument containing spaces into
# several arguments.
例:呼び出し
wrapper "one two three" four five "six seven"
結果として:
"$@": wrappedProgram "one two three" four five "six seven"
"$*": wrappedProgram "one two three four five six seven"
^^^^ These spaces are part of the first
argument and are not changed.
$*: wrappedProgram one two three four five six seven
これらはコマンドライン引数です。
$@
=すべての引数を文字列のリストに保存します$*
=すべての引数を単一の文字列として保存します$#
=引数の数を格納します
純粋な$@
を使用すると、ほとんどの場合、「できる限りプログラマを苦しめる」ことを意味します。ほとんどの場合、Wordの分離や引数内のスペースやその他の文字の問題につながるからです。
(推測される)99%のケースでは、それを"
で囲む必要があります:"$@"
は、引数を確実に反復処理するために使用できます。
for a in "$@"; do something_with "$a"; done
@
1から始まる定位置パラメーターに展開します。二重引用符内で展開すると、各パラメーターが個別のWordに展開されます。つまり、 "$ @"は "$ 1" "$ 2"と同等です。..二重引用符で囲まれた展開がWord内で発生する場合、最初のパラメーターの展開は元のWordの開始部分と結合され、最後のパラメーターの展開は、元のWordの最後の部分と結合されます。位置パラメータがない場合、「$ @」と$ @は何も展開されません(つまり、削除されます)。