Verwendung von IFS in „for-Schleife“

Verwendung von IFS in „for-Schleife“
lis="a:b:c:d:"

IFS=:

Wenn ich den folgenden Code ausführe,

for i in "a:b:c:d:";
do 
    echo the output is $i
done

Ich bekomme:

the output is a b c d

Wenn ich stattdessen „a:b:c:d:“ durch $lis ersetze:

for i in $lis;
do 
    echo the output is $i
done

Ich habe die erwartete Ausgabe:

the output is a
the output is b
the output is c
the output is d

Ich frage mich, was falsch ist, $lis ist im Grunde dasselbe wie „a:b:c:d“

Antwort1

Der große Unterschied besteht darin, wo die Worttrennung durchgeführt wird. Doppelte Anführungszeichen stellen sicher, dass eine wörtliche Zeichenfolge oder eine in Anführungszeichen gesetzte Variable wie "$lis"als einzelnes Element behandelt wird

for i in "a:b:c:d:";
do 
    echo the output is $i
done

Daher ist in dieser Schleife das doppelte Anführungszeichen "a:b:c:d:"ein einzelnes Element, weshalb Sie nur eine Ausgabezeile sehen

the output is a b c d

for i in $lis;
do 
    echo the output is $i
done

Hier $lisist das nicht in Anführungszeichen gesetzt, daher führt die Shell eine Worttrennung entsprechend dem IFSvon Ihnen festgelegten Wert durch. Die Shell sieht, dass der For-Schleife 4 Elemente bereitgestellt werden. Daher sehen Sie vier Ausgabezeilen.

Wenn Sie "$lis"die Variable in doppelte Anführungszeichen setzen, wird die Worttrennung nicht durchgeführt. Daher sollte die Ausgabe (nur eine Zeile) identisch wie im ersten Fall sein.

verwandte Informationen