Warum liest du in bash keine Zeilen mit "for"?

7

Ich habe gelesen, dass die Verwendung von "for" keine gute Möglichkeit ist, Zeilen in bash zu lesen. Viele Leute sagen, dies sei ungeschickt und bestenfalls ineffizient und scheitere in vielen Fällen.

Ich würde gerne wissen, wie man Zeilen in Bash am besten liest. Vielen Dank.

Zum Beispiel:

$ for i in $(<afile); do echo "$i"; done
Kyrol
quelle
1
Haben Sie ein Beispiel für ein Bash-Skript, das Sie mit "for" geschrieben haben?
L2G
Zum Beispiel: $ für i in $ (& lt; afile); Echo "$ i"; erledigt
Kyrol

Antworten:

16

Ich bin mir nicht sicher, was genau du meinst, aber ich gehe davon aus, dass du darüber sprichst for line in $(cat file); do * und ähnliche Konstrukte. Dies ist ineffizient, da bash eine Subshell erzeugen und ausführen muss cat, lesen cat Ausgabe von - die gesamte Datei - in Erinnerung, analysieren Sie es (das ist der langsamste Teil ), erst dann über alle Daten iterieren. Unzuverlässig, weil bash funktioniert Wortspaltung auf die Daten - nicht nur auf Zeilenumbrüche aufgeteilt, sondern auch auf alles in $ IFS (Leerzeichen, Tabulatoren ...)

(Wenn du benutzt $(<...) anstatt $(cat ...)Sie sparen unter Linux zwei Millisekunden, aber alle anderen Nachteile bleiben bestehen.)

Eine viel bessere Option ist die Verwendung read in einem while Schleife:

while read -r line; do
    echo "Input: $line"
done < myfile.txt

Oder aus einem Programm:

cat file1 file2 file3 |
while read -r line; do
    echo "Input: $line"
done

Dies liest nur so viel wie nötig, führt keine unnötige Verarbeitung durch, sondern ermöglicht eine benutzerdefinierte Feldaufteilung und ist bei großen Dateien um ein Vielfaches schneller und ressourcenschonender.

Siehe auch:

grawity
quelle
Sehr nette Antwort! Du hast mir gezeigt, was ich verstehen wollte! Vielen Dank!
Kyrol