Per Definition besteht eine Textdatei aus einer Folge von Zeilen. Eine Zeile endet mit einem Zeilenumbruch. Daher endet eine Textdatei mit einem Zeilenumbruch, sofern sie nicht leer ist.
Das read
eingebaute Gerät dient nur zum Lesen von Textdateien. Sie übergeben keine Textdatei und können daher nicht hoffen, dass sie nahtlos funktioniert. Die Shell liest alle Zeilen - was sie überspringt, sind die zusätzlichen Zeichen nach der letzten Zeile.
Wenn Sie eine möglicherweise fehlerhafte Eingabedatei haben, in der möglicherweise die letzte Zeile fehlt, können Sie zur Sicherheit eine neue Zeile hinzufügen.
{ cat "/tmp/urlFile"; echo; } | …
Dateien, bei denen es sich um Textdateien handeln sollte, denen jedoch der letzte Zeilenumbruch fehlt, werden häufig von Windows-Editoren erstellt. Dies erfolgt normalerweise in Kombination mit Windows-Zeilenenden, bei denen es sich im Gegensatz zu Unix LF um CR LF handelt. CR-Zeichen sind selten nützlich und können auf keinen Fall in URLs angezeigt werden. Sie sollten sie daher entfernen.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | …
Wenn die Eingabedatei wohlgeformt ist und mit einer neuen echo
Zeile endet, wird eine zusätzliche leere Zeile hinzugefügt . Da URLs nicht leer sein dürfen, ignorieren Sie einfach leere Zeilen.
Beachten Sie auch, dass read
Zeilen nicht einfach gelesen werden. Es ignoriert führende und nachfolgende Leerzeichen, was für eine URL wahrscheinlich wünschenswert ist. Backslash am Ende einer Zeile wird als Escape-Zeichen behandelt, wodurch die nächste Zeile mit der ersten minus der Backslash-Newline-Sequenz verbunden wird, was definitiv nicht wünschenswert ist. Sie sollten also die -r
Option an übergeben read
. Es ist sehr, sehr selten, dass read
man eher das Richtige ist als read -r
.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | while read -r url
do
if [ -z "$url" ]; then continue; fi
…
done