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 行のみ)が表示されます。