--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=$@

おすすめ記事