lis="a:b:c:d:"
IFS=:
次のコードを実行すると、
for i in "a:b:c:d:";
do
echo the output is $i
done
私は得る:
the output is a b c d
"a:b:c:d:" を $lis に置き換えると:
for i in $lis;
do
echo the output is $i
done
予想される結果は次のとおりです。
the output is a
the output is b
the output is c
the output is d
何が問題なのか気になります。 $ lisはデフォルトでは「a:b:c:d」と同じです。
答え1
最大の違いは噴射の位置です。二重引用符は、リテラル文字列または引用符付き変数が"$lis"
単一の項目として扱われるようにします。
for i in "a:b:c:d:";
do
echo the output is $i
done
したがって、このループでは二重引用符"a:b:c:d:"
は単一の項目なので、出力は1行しか表示できません。
the output is a b c d
for i in $lis;
do
echo the output is $i
done
これは$lis
引用されていないため、シェルはIFS
ユーザーが設定した値に基づいて単語の分離を実行します。シェルは、forループに4つの項目があることを確認します。これが4行の出力が見える理由です。
"$lis"
変数に二重引用符を使用すると単語の区切りは行われないため、最初の場合と同じ出力(1行)が表示されます。