Ich habe gelesen, dass es schlecht ist, Dinge zu schreiben, wie es for line in $(command)
der richtige Weg zu sein scheint:
command | while IFS= read -r line; do echo $line; done
Das funktioniert super. Was aber, wenn ich den Inhalt einer Variablen und nicht das direkte Ergebnis eines Befehls durchlaufen möchte ?
Stellen Sie sich beispielsweise vor, Sie erstellen die folgende Datei quickfox
:
The quick brown
foxjumps\ over -
the
lazy ,
dog.
Ich möchte in der Lage sein, so etwas zu tun:
# This is just for the example,
# I could of course stream the contents to `read`
variable=$(cat quickfox);
while IFS= read -r line < $variable; do echo $line; done; # this is incorrect
$variable
Wenn Sie es verwenden, müssen Sie es in doppelte Anführungszeichen setzen, andernfallswhile
erhält die Schleife nur eine Eingabezeile. Siehe zum Beispiel den Unterschied in der Leistung zwischenecho $variable
vsecho "$variable"
odercat <<< $variable
vscat <<< "$variable"
.variable=$(cat quickfox)
Frage im OP selbst liefert ein Beispiel für das, worüber ich gesprochen habe. Wenn Sie das$variable
in Anführungszeichen setzen, werden die Zeilenumbrüche eingeschlossen, wenn Sie es ohne Anführungszeichen verwenden, werden die Zeilenumbrüche von der Shell in Leerzeichen übersetzt. Wenn Sie zeilenweise lesen und verarbeiten, ist dies ein großer Unterschied - bei ersteren gibt es mehrere Eingabezeilen, bei letzteren nur eine Eingabezeile. Die Eingabedaten sind oberflächlich ähnlich, aber in der Praxis in diesen beiden Fällen völlig unterschiedlich.cat <<< "$variable" | wc -l
5cat <<< $variable | wc -l
zurück. Gibt 1 zurück. Wenn Sie Leerzeichen (einschließlich Zeilenumbrüche, Tabulatoren, einzelne oder mehrere Leerzeichen) in einer Variablen beibehalten möchten / müssen, MÜSSEN Sie die Variable bei der Verwendung in doppelte Anführungszeichen setzen, andernfalls Sie werden alle in ein einzelnes Leerzeichen zwischen jedem "Wort" umgewandelt.