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

関連情報