@
シェルスクリプトでは、ドル記号の後にアットマーク()が続くとどうなりますか?
例えば:
umbrella_corp_options $@
@
シェルスクリプトでは、ドル記号の後にアットマーク()が続くとどうなりますか?
例えば:
umbrella_corp_options $@
回答:
$@
あるすべてのスクリプトに渡されたパラメータのは。
たとえば、呼び出すと./someScript.sh foo bar
、$@
はに等しくなりfoo bar
ます。
もし、するなら:
./someScript.sh foo bar
そして、内部someScript.sh
参照:
umbrella_corp_options "$@"
これはumbrella_corp_options
、二重引用符で囲まれた個々のパラメーターとともに渡され、呼び出し元から空白スペースのあるパラメーターを取得して渡すことができます。
someScript.sh foo bar "boo far"
?
$@
が、必ずしもスクリプトに渡されたパラメータから来るわけではありません ...例; set a b "x y"; printf '(%s)' "$@"
出力(a)(b)(x y)
$@
と$*
$@
はとほぼ同じで$*
、どちらも「すべてのコマンドライン引数」を意味します。それらはしばしば、単にすべての引数を別のプログラムに渡すために使用されます(したがって、他のプログラムのラッパーを形成します)。
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
wrappedProgram "$*"
-> separated by single spaces.
しかし、2番目の例では、1つのスペースで区切られていません。
これらはコマンドライン引数です:
$@
=すべての引数を文字列のリストに
$*
保存します=すべての引数を単一の文字列として
$#
保存します=引数の数を保存します
純粋な使用法は、$@
ほとんどの場合、「プログラマにできる限りの負担をかける」ことを意味します。これは、ほとんどの場合、単語の分離や、引数のスペースやその他の文字に問題が発生するためです。
すべての例(推測)は99%で、それを囲むことが必要です"
。"$@"
引数を介して確実に反復するために使用することができるものです。
for a in "$@"; do something_with "$a"; done
for a in start_token "$@" end_token; do something_with "$a"; done
:-)と考えてください
@
1つから開始して、位置パラメーターに展開します。展開が二重引用符で囲まれている場合、各パラメーターは個別の単語に展開されます。つまり、 "$ @"は "$ 1" "$ 2" ...と同等です。二重引用符で囲まれた展開が単語内で発生すると、最初のパラメータの展開が元の単語の最初の部分と結合され、最後のパラメーターの展開は、元の単語の最後の部分と結合されます。位置パラメータがない場合、「$ @」と$ @は何も展開しません(つまり、削除されます)。
簡単に言うと$@
、呼び出し元から関数またはスクリプトに渡される位置引数に展開されます。その意味はコンテキスト依存です。関数内では、そのような関数に渡される引数に展開されます。スクリプト内(関数のスコープ内ではない)で使用すると、そのようなスクリプトに渡された引数に展開されます。
$ cat my-sh
#! /bin/sh
echo "$@"
$ ./my-sh "Hi!"
Hi!
$ put () ( echo "$@" )
$ put "Hi!"
Hi!
さて、$@
シェルでどのように動作するかを理解する上で最も重要な別のトピックは、単語分割です。シェルは、IFS
変数の内容に基づいてトークンを分割します。デフォルト値は\t\n
です。つまり、空白、タブ、改行です。
展開"$@"
すると、渡された引数の元のコピーが得られます。ただし、拡張$@
は常に行われるわけではありません。より具体的には、引数にの文字が含まれている場合IFS
、それらは分割されます。
ほとんどの場合、使用したいのはそうでは"$@"
ありません$@
。