2012-04-03 5 views
72

ドル記号の後にシェルスクリプトのアットマーク(@)の意味はありますか?例えば

umbrella_corp_options [email protected] 
+4

([$ @をやbashで$ @の、について説明を探して何である]の可能重複http://stackoverflow.com/questions/3898665/what-is-for-an-bash-in-in-bash) – l0b0

答えて

106

[email protected]スクリプトに渡されたパラメータのすべてです。

例えば、./someScript.sh foo barを呼び出した場合、[email protected]foo barに等しくなります。

そうした場合:

./someScript.sh foo bar 

、その後someScript.sh参照の内側:

umbrella_corp_options "[email protected]" 

これは空白でパラメータを取ることができるように、二重引用符で囲まれた個々のパラメータでumbrella_corp_optionsに渡されます発信者から送信し、それらを渡します。

@

+0

STATUS_ACCESS_DEN ...すてきな編集ありがとう! – Har

+0

'someScript.sh foo bar"を "far" 'にした場合、$ @は何を含んでいますか? – trusktr

+0

http://teaching.idallen.com/dat2330/04f/notes/shell_variables.txtこれを確認してください。 – Har

5

From the manual:

ものから、位置パラメータに展開。展開が二重引用符で囲まれると、各パラメータは別の単語に展開されます。つまり、 "$ @"は "$ 1" "$ 2"に相当します。単語内で二重引用符で囲まれた展開が行われると、最初のパラメータの展開が元の単語の先頭部分と結合され、最後のパラメータの拡張は元の単語の最後の部分と結合されます。位置パラメータがない場合、「$ @」と$ @は何も展開しません(つまり、それらは削除されます)。

8

、ほとんどの場合、純粋[email protected]手段の使用ほとんどの場合、それは単語の区切りとし、引数にスペースや他の文字との問題につながるため、「することができますようにハードとしてのプログラマを傷つけます」。

すべてのケースの99%(推定)で、"に囲む必要があります。"[email protected]"は、引数を確実に反復処理するために使用できるものです。

for a in "[email protected]"; do something_with "$a"; done 
+4

あなたの行次のように書くことができます。 something_with "$ a"を実行します。 done ;-) – Alfe

+1

@Alfe知っている;私はちょうどそれを忘れてしまった。それを 'for a start_token" $ @ "end_tokenと考えてください。 something_with "$ a"を実行します。 done ":-) – glglgl

54

[email protected]$*とほぼ同じである、両方の「すべてのコマンドライン引数」を意味します。彼らはしばしば、すべての引数を別のプログラムに渡すだけでよく(したがって、他のプログラムの周りにラッパーを形成します)。

引数にスペースが含まれていると、2つの構文の違いが表示されます(例:)と二重引用符で[email protected]を置く:

wrappedProgram "[email protected]" 
# ^^^ 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" 

を呼ぶことになります:=

[email protected]

"[email protected]": wrappedProgram "one two three" four five "six seven" 
"$*": wrappedProgram "one two three four five six seven" 
$*: wrappedProgram one two three four five six seven 
+1

IFSを使用した$ *の副作用については、同じではなく、マンページも$ *の副作用があります。これは必ずしもスペースではありません。 (両者が同じであれば、おそらく互換性以外の点はありません)。 –

+5

そうではありません。そして、私は次のように2行を言った: "2人の違い..."短い文章を読みやすくするために、読者は複数の文章を読まなければならない。 -/ – Alfe

+1

Alfe、Christofferの挿入1つの言葉は、「やや」、差異をなくし、敏感さや読みやすさを犠牲にすることはありませんでした。実際、私はこの差異の微妙な強調のために、(あなたが受けたものとは対照的に)この答えをアップアップしました。 ;) –

13

これらは、コマンドライン引数ですすべての引数を文字列リストに格納します
$* =店舗単一の文字列
$#など、すべての引数=店舗引数の数

+1

あなたは '$ @'と '$ *'を後方に持っています – iruvar

関連する問題