2

私は Bash を初めて使用しますが、Bash によって自動単語分割が行われていることがわかります。

a="1  2     3 4"

echo $aI gotで"a" をエコーすると1 2 3 4、暗黙的に単語分割が行われます。「a」をループすると、それぞれ 1、2、3、4 が得られます。

私もここからそれを読んだ

シェルは、単語分割のために二重引用符内で発生しなかったパラメーター展開、コマンド置換、および算術展開の結果をスキャンします。

そして、もし私が持っているなら

b=$a;
echo "$b"

私は得るだろう

"1 2 3 4"

だから、ここに私の問題があります:単語の分割はいつ行われますか? 文字列自体を変更しますか?echoor for(ループ)を使用した場合にのみ効果がありますか?

より一般的には、bash はそれをどのように処理しますか?

4

3 に答える 3

4

実際には、単語分割にはいくつかのラウンドがあります。1 つ目は、コマンド ラインを解析する前に実行されるため、と の 2 つの単語にecho $a分割されます。(これがパイプラインを実行しない理由です。展開される前に解析が完了します)。単語分割のラウンドが終了した後、パラメーター展開が発生して 2 つの文字列が生成され、. パラメーター展開の結果の文字列は、引用符で囲まれていないため、単語分割自体を受け、4 つの追加の単語、、、が生成されます。echo$aa="echo foo | wc -l"; $a$aecho1 2 3 41234

for ループでは、リスト内の項目が単語分割の対象になります。

for b in $a; do

は (単語分割で , , , , が生成された後for) b, , , ,inおよび$aに展開;されます。ここでも、パラメーター展開の結果の文字列は、 、 、 、および に単語分割されます。doforbin1 2 3 4;do1234

于 2013-08-28T21:25:51.283 に答える
2

読んでくださいman bash。割り当てのために、それは言う

すべての値は、チルダ展開、パラメータと変数の展開、コマンド置換、算術展開、および引用符の削除を受けます [ ... ] 以下の特殊パラメータで説明されているように、「$@」を除いて、単語分割は実行されません。パス名展開は行いません。

[[ ]]単語分割は、次の条件でも発生しません。

[[ と ]] の間の単語に対して、単語の分割とパス名の展開は実行されません。

于 2013-08-28T21:14:58.447 に答える