~からhttps://unix.stackexchange.com/a/32227/674
二重引用符を使用しないのが安全な主な場所は次のとおりです。
- 割り当てでは:(しかし、
foo=$bar
例えば配列割り当て内では二重引用符が必要です。)export "foo=$bar"
array=("$a" "$b")
$bar
これは、値を割り当てるときに二重引用符が必要ないという意味ですかfoo=$bar
?なぜ?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の適用を受けます。