web-dev-qa-db-ja.com

シェルスクリプトで$ @はどういう意味ですか?

シェルスクリプトで、ドル記号の後にアットマーク(@)が続くとはどういう意味ですか?

例えば:

umbrella_corp_options $@
141
trusktr

$@は、スクリプトに渡されるパラメーターのallです。

たとえば、./someScript.sh foo barを呼び出すと、$@foo barと等しくなります。

もしあなたがそうするなら:

./someScript.sh foo bar

そして、someScript.sh参照内:

umbrella_corp_options "$@"

これは、個々のパラメーターを二重引用符で囲んでumbrella_corp_optionsに渡されます。これにより、呼び出し側から空白のあるパラメーターを取得して渡すことができます。

192
Har

$@$*とほぼ同じで、両方とも「すべてのコマンドライン引数」を意味します。多くの場合、すべての引数を別のプログラムに単純に渡すために使用されます(したがって、他のプログラムの周りにラッパーを形成します)。

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
86
Alfe

これらはコマンドライン引数です。

$@ =すべての引数を文字列のリストに保存します
$* =すべての引数を単一の文字列として保存します
$# =引数の数を格納します

28
Sameer Duwal

純粋な$@を使用すると、ほとんどの場合、「できる限りプログラマを苦しめる」ことを意味します。ほとんどの場合、Wordの分離や引数内のスペースやその他の文字の問題につながるからです。

(推測される)99%のケースでは、それを"で囲む必要があります:"$@"は、引数を確実に反復処理するために使用できます。

for a in "$@"; do something_with "$a"; done
9
glglgl

マニュアルから:

@

1から始まる定位置パラメーターに展開します。二重引用符内で展開すると、各パラメーターが個別のWordに展開されます。つまり、 "$ @"は "$ 1" "$ 2"と同等です。..二重引用符で囲まれた展開がWord内で発生する場合、最初のパラメーターの展開は元のWordの開始部分と結合され、最後のパラメーターの展開は、元のWordの最後の部分と結合されます。位置パラメータがない場合、「$ @」と$ @は何も展開されません(つまり、削除されます)。