Angenommen, ich habe diese Datei:
hello
world
hello world
Dieses Programm
#!/bin/bash
for i in $(cat $1); do
echo "tester: $i"
done
Ausgänge
tester: hello
tester: world
tester: hello
tester: world
Ich möchte, dass die for
Iteration über jede Zeile einzeln erfolgt, wobei Leerzeichen ignoriert werden, dh die letzten beiden Zeilen sollten durch ersetzt werden
tester: hello world
Mit Zitaten for i in "$(cat $1)";
führt i
wird die gesamte Datei auf einmal zugewiesen. Was soll ich ändern?
quelle
<
in eine ganze Schleife geraten kann. Obwohl es jetzt absolut sinnvoll ist, habe ich es gesehenIFS \ read -r line' in second example. Is really
IFS = `benötigt? IMHO es genug zu sagen:while read -r line; do echo "tester: $line"; done < "$1"
IFS=
das Entfernen von führenden und nachfolgenden Leerzeichen. Siehe Inwhile IFS= read..
, warum hat IFS keine Wirkung?Für das, was es wert ist, muss ich das ziemlich oft tun und kann mich nie an die genaue Art der Verwendung erinnern
while IFS= read...
, also habe ich die folgende Funktion in meinem Bash-Profil definiert:Diese Funktion bestimmt zuerst die Anzahl der Zeilen in der Datei,
sed
extrahiert dann Zeile für Zeile und übergibt jede Zeile als einzelnes Zeichenfolgenargument an eine bestimmte Funktion. Ich nehme an, dass dies bei großen Dateien wirklich ineffizient wird, aber das war bisher kein Problem für mich (Vorschläge zur Verbesserung dieses Willkommens natürlich).Die Verwendung ist ziemlich süß IMO:
quelle