--text="$@"が最初の単語だけを渡すのはなぜですか?

--text="$@"が最初の単語だけを渡すのはなぜですか?

たとえば、いくつかのパラメータを使用して次のスクリプトを実行するとarg1 arg2 arg3

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

zenityは、「arg1」というテキストを含む入力ダイアログを生成します。一方、私は「arg1 arg2 arg3」を期待しました。

以下のスクリプトのような変数を使用すると、アイテムテキストのすべてのパラメータが表示されます。

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

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

答え1

$@で説明されているように別の単語に展開し、$*単一の単語に展開します。bash手動。だから文章を書くとき

zenity --text="$@"

それは拡張される

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

ただし、シェル変数の割り当てはトークン化されません。拡張変数割り当てリストでは、フィールド/単語の分割は省略されています。bash手動。この動作は次のように一致します。POSIX仕様。だから文章を書くとき

text="$@"

変数はtextすべての位置引数を単一の単語として取得しますtext="$*"。これは、実際に変数の割り当てに二重引用符が必要ない理由です。両方

text=$@

そして

text=$*

完全に安全です。

だから、

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

"$text"単一の単語に拡張されるので動作します。--option="$@"これはシェル変数の代入ではなくコマンドの一般的な引数にすぎませzenitytext=$@

答え2

$@各引数を別々の単語に拡張して

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

$*1つの単語に展開するには反対を使用してください。

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

これになります

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

関連情報