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 hätte gerne den for
durchlaufen Sie jede Zeile einzeln und ignorieren Sie dabei Leerzeichen, d.h. die letzten beiden Zeilen sollten durch
tester: hello world
Verwendung von Anführungszeichen for i in "$(cat $1)";
ergibt i
die gesamte Datei auf einmal zugewiesen wird. Was soll ich ändern?
Akzeptierte Antwort:
(9 Jahre später:)
Beide Antworten würden bei Dateien ohne Zeilenumbruch am Ende fehlschlagen, dies würde effektiv die letzte Zeile überspringen, keine Fehler erzeugen, würde zu einer Katastrophe führen (auf die harte Tour gelernt:).
Die beste prägnante Lösung, die ich bisher gefunden habe, die „einfach funktioniert“ (sowohl in bash als auch in sh):
while IFS='' read -r LINE || [ -n "${LINE}" ]; do
echo "processing line: ${LINE}"
done < /path/to/input/file.txt
Eine ausführlichere Diskussion finden Sie in dieser StackOverflow-Diskussion:How to use „while read“ (Bash) to read the last line in a file if there’s no newline at the end of the file?
Achtung:Dieser Ansatz fügt der letzten Zeile einen zusätzlichen Zeilenumbruch hinzu, falls noch keiner vorhanden ist.