「for ループ」での IFS の使用

「for ループ」での IFS の使用
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 行のみ)が表示されます。

関連情報