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


回答:


243

$@あるすべてのスクリプトに渡されたパラメータのは。

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

もし、するなら:

./someScript.sh foo bar

そして、内部someScript.sh参照:

umbrella_corp_options "$@"

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


1
$ @には何を含めますかsomeScript.sh foo bar "boo far"
trusktr 2012


7
二重引用符で囲まれた場合、$ @は特別です。次に、3つの引数 "foo"、 "bar"、および "boo far"に、引用符で囲まれた値のリスト(この場合はtrusktr)が表示されます。
Alfe、2012

4
一般的にそうです$@、必ずしもスクリプトに渡されたパラメータから来るわけではありませ ...例; set a b "x   y"; printf '(%s)' "$@"出力(a)(b)(x   y)
Peter.O

私より良いアルフェの答えのように、彼が主な違い与えるので、$@$*
donleyp

106

$@はとほぼ同じで$*、どちらも「すべてのコマンドライン引数」を意味します。それらはしばしば、単にすべての引数を別のプログラムに渡すために使用されます(したがって、他のプログラムのラッパーを形成します)。

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

2
それらは同じではなく、マンページは、必ずしもスペースではないIFSを使用した$ *の副作用について明確です。(それらが同じである場合、おそらく両方を提供することには互換性以外の点はありません。)
jørgensenApr

6
いいえそうではありません。そして、私は以下のように2行言った:「2つの違い...」短い文を取得して読みやすくするために、読者は評決を下す前に複数の文を読む必要があります:-/
Alfe

2
Alfe、クリストファーがその1つの単語を「ほぼ」挿入したことは、簡潔さや読みやすさを犠牲にすることなく、大きな違いをもたらしました。実際、私はこの答えを(受け入れられたものとは対照的に)正確に違いを強調したために賛成しました...- それがほとんどあなたの意思に反することに気づく前に!;)
Sz。

最初の文を読んだ直後に評決を下す人たちにとって、この言葉は大きな違いをもたらしたと思います;-)そして、私の意思に反することは決してありませんでした。こういう人にも書いてみたいです。
Alfe

非常に不明確。wrappedProgram "$*"-> separated by single spaces.しかし、2番目の例では、1つのスペースで区切られていません。
Felix Dombek

36

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

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


(@iruvarによって言及された上記の不正確さは修正されました。)
Mateen Ulhaq

13

純粋な使用法は、$@ほとんどの場合、「プログラマにできる限りの負担をかける」ことを意味します。これは、ほとんどの場合、単語の分離や、引数のスペースやその他の文字に問題が発生するためです。

すべての例(推測)は99%で、それを囲むことが必要です""$@"引数を介して確実に反復するために使用することができるものです。

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

4
行は次のように書くことができます。something_with "$ a"; 完了;-)
Alfe

1
@Alfe知っています。忘れてしまいました。for a in start_token "$@" end_token; do something_with "$a"; done:-)と考えてください
glglgl

9

マニュアルから:

@

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


1

意味。

簡単に言うと$@、呼び出し元から関数またはスクリプトに渡される位置引数展開されます。その意味はコンテキスト依存です。関数内では、そのような関数に渡される引数に展開されます。スクリプト内(関数のスコープ内ではない)で使用すると、そのようなスクリプトに渡された引数に展開されます。

$ cat my-sh
#! /bin/sh
echo "$@"

$ ./my-sh "Hi!"
Hi!
$ put () ( echo "$@" )
$ put "Hi!"
Hi!

単語分割。

さて、$@シェルでどのように動作するかを理解する上で最も重要な別のトピックは、単語分割です。シェルは、IFS変数の内容に基づいてトークンを分割します。デフォルト値は\t\nです。つまり、空白、タブ、改行です。

展開"$@"すると、渡された引数の元のコピーが得られます。ただし、拡張$@は常に行われるわけではありません。より具体的には、引数にの文字が含まれている場合IFS、それらは分割されます。


ほとんどの場合、使用したいのはそうでは"$@"ありません$@

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.