`foo=$bar` を指定するときに二重引用符 `$bar` が不要なのはなぜですか? [コピー]

`foo=$bar` を指定するときに二重引用符 `$bar` が不要なのはなぜですか? [コピー]

~からhttps://unix.stackexchange.com/a/32227/674

二重引用符を使用しないのが安全な主な場所は次のとおりです。

  • 割り当てでは:(しかし、 foo=$bar例えば配列割り当て内では二重引用符が必要です。)export "foo=$bar"array=("$a" "$b")
  1. $barこれは、値を割り当てるときに二重引用符が必要ないという意味ですかfoo=$bar?なぜ?

  2. export "foo=$bar"たとえば、配列の割り当てに二重引用符を使用するのはなぜですかarray=("$a" "$b")

ありがとうございます。

ベストアンサー1

foo=$bar

はい安全なぜなら仕事、スカラー割り当て構文を使用して、スカラー変数に値を割り当てます。それスカラーコンテキスト、1つの値しか保存できないため、$var分割またはglobは意味がありません$bar。拡張によって複数の単語が生成される場合、シェルはその単語を$foo

以下を使用すると状況が異なります。

foo=($bar)

配列変数に割り当てる位置です。これはリストのコンテキストです。配列要素に複数の単語を割り当てています。分割+グローブが発生します。

exportまた、一部のシェルでは、// local/ typeset/declareなどの二重属性に注意してくださいreadonly(参照ローカル変数の割り当てには引用符が必要ですか?)

あなたは次のことを知るでしょう:

foo=$bar

割り当て文として解析されます。

"foo"=$bar

コマンドを実行してみてくださいfoo=content_of_bar(barの内容は分割+globの影響を受けます)。

export(and other local/ typeset...)がキーワードであり、組み込みコマンドであるシェル(最新バージョンのksh、bash、およびzsh)では、次の場所にあります。

export foo=$bar

exportとみなされるキーワードfoo=$bar割り当てとして$bar分割+globの影響を受けません。しかし、export考慮を止めるには多くの努力は必要ありません。キーワード。この場合、これは単純なコマンドとして扱われ、他のコマンドの引数と同様にSplit + globが発生します。

キーワードとして扱われてもexport引数が変数代入のように見えない場合(上記のように"foo"=$bar)、通常の引数として扱われ、再び分割+globの適用を受けます。

おすすめ記事