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 $lis
ist das nicht in Anführungszeichen gesetzt, daher führt die Shell eine Worttrennung entsprechend dem IFS
von 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.