--text =“ $ @”が最初の単語のみを渡すのはなぜですか?


9

私のようないくつかの引数を指定して、次のスクリプトを実行するとarg1 arg2 arg3

#!/bin/bash
zenity --entry --text="$@"

zenityは、「arg1」というテキストで入力ダイアログを作成しますが、「arg1 arg2 arg3」が必要です。

次のスクリプトのような変数を使用すると、エントリテキストのすべての引数が表示されます。

#!/bin/bash
text="$@"
zenity --entry --text="$text"

これらのスクリプトの違いは何ですか?なぜ最初のもの$@は最初の引数だけで置き換えられるのですか?

回答:


16

$@マニュアルで$*説明されているように、個別の単語に展開されます(一方、単一の単語に展開されbashます)。したがって、あなたが書くとき

zenity --text="$@"

それはに拡大します

zenity --text="$1" "$2" "$3"

ただし、シェル変数の割り当ては単語分割されません。bashマニュアルの変数割り当ての展開のリストでは、フィールド/単語分割は省略されていることに注意してください。この動作はPOSIX仕様と一致しています。だから、あなたが書くとき

text="$@"

変数textは、位置パラメータのすべてを1つの単語として取得します。これは、を記述した場合と同じですtext="$*"。実際、これが、変数の割り当てで二重引用符が不要になることが多い理由です。どちらも

text=$@

そして

text=$*

完全に安全です。

そう、

text=$@
zenity --option="$text"

"$text"これが機能する理由は、1つの単語に拡張されます。--option="$@"はコマンドの通常の引数zenityであり、シェル変数の割り当てではないことに注意してください。そのため、ここでは単語分割が行われますが、では行われませんtext=$@


1
+1。また、これは動作します:zenity --text="$*"- "$*"単一の単語に展開します。
グレン・ジャックマン、

+1を教えてくれました:man!=ドキュメント。私はinfo bashを検索するべきでした、それはあなたがリンクしたマニュアルセクションも含みます。
manatwork 2012年

7

$@ 各パラメータを別々の単語で展開して、

zenity --entry --text="arg1" "arg2" "arg3" # syntactically wrong for zenity

$*代わりに使用して、1つの単語で展開します

zenity --entry --text="$*"

なる

zenity --entry --text="arg1 arg2 arg3" # syntactically correct for zenity

OPの質問からの$ textバリアントが期待どおりに機能する理由を明らかにしてください
iruvar

@ChandraRavoori、あなたはそれで私を捕まえた。マニュアルによると、「「$ @」を除いて単語分割は実行されません」と「単語内で二重引用符で囲まれた展開が発生した場合、最初のパラメータの展開は元の単語の先頭部分と結合されます。そして最後のパラメーターの展開は、元の単語の最後の部分と結合text="$@"されtext="arg1" "arg2" "arg3"ます。しかし、確かにそうではありません。
manatwork 2012年

@ChandraRavooriその理由は、変数の割り当てではフィールド分割が発生しないためです。私は私の答えでより詳細に説明します
jw013

@ jw013:しかしに従ってバッシュリファレンスマニュアル"$@" 、単語分割を受けるも、変数の代入で。
ruakh

@ruakh私が知る限り、bashのマニュアルにはそれが記載されていません。見積もりはありますか?
jw013 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.