Z definicji plik tekstowy składa się z sekwencji wierszy. Linia kończy się znakiem nowej linii. Zatem plik tekstowy kończy się znakiem nowej linii, chyba że jest pusty.
read
Wbudowane jest przeznaczona tylko do odczytu plików tekstowych. Nie przekazujesz pliku tekstowego, więc nie możesz mieć nadziei, że będzie działał bezproblemowo. Powłoka czyta wszystkie linie - pomija dodatkowe znaki po ostatniej linii.
Jeśli masz potencjalnie zniekształcony plik wejściowy, w którym może brakować ostatniego wiersza, możesz dodać do niego nowy wiersz, dla pewności.
{ cat "/tmp/urlFile"; echo; } | …
Pliki, które powinny być plikami tekstowymi, ale nie mają ostatniej linii nowej linii, są często tworzone przez edytory Windows. Zwykle dzieje się to w połączeniu z zakończeniami linii Windows, które są CR LF, w przeciwieństwie do LF Unixa. Znaki CR są rzadko przydatne w dowolnym miejscu i w żadnym wypadku nie mogą pojawiać się w adresach URL, dlatego należy je usunąć.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | …
W przypadku, gdy plik wejściowy jest poprawnie uformowany i kończy się nową linią, echo
dodaje dodatkową pustą linię. Ponieważ adresy URL nie mogą być puste, po prostu zignoruj puste wiersze.
Zauważ też, że read
nie odczytuje wierszy w prosty sposób. Ignoruje początkowe i końcowe białe znaki, co w przypadku adresu URL jest prawdopodobnie pożądane. Traktuje odwrotny ukośnik na końcu linii jako znak zmiany znaczenia, powodując połączenie następnej linii z pierwszym minus sekwencją odwrotnego ukośnika-nowa linia, co zdecydowanie nie jest pożądane. Powinieneś więc przekazać tę -r
opcję read
. To jest bardzo, bardzo rzadkie, read
aby być właściwą rzeczą, a nie read -r
.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | while read -r url
do
if [ -z "$url" ]; then continue; fi
…
done