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.
readWbudowane 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ą, echododaje dodatkową pustą linię. Ponieważ adresy URL nie mogą być puste, po prostu zignoruj puste wiersze.
Zauważ też, że readnie 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ę -ropcję read. To jest bardzo, bardzo rzadkie, readaby 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