Per definizione , un file di testo è costituito da una sequenza di righe. Una riga termina con un carattere di nuova riga. Pertanto un file di testo termina con un carattere di nuova riga, a meno che non sia vuoto.
L' read
integrato è pensato solo per leggere file di testo. Non stai passando un file di testo, quindi non puoi sperare che funzioni senza problemi. La shell legge tutte le righe: ciò che sta saltando sono i caratteri extra dopo l'ultima riga.
Se si dispone di un file di input potenzialmente non valido che potrebbe mancare all'ultima riga, è possibile aggiungere una nuova riga ad esso, solo per essere sicuri.
{ cat "/tmp/urlFile"; echo; } | …
I file che dovrebbero essere file di testo ma che mancano della nuova riga finale vengono spesso prodotti dagli editor di Windows. Questo di solito va in combinazione con i finali di linea di Windows, che sono CR LF, al contrario di Lx di Unix. I caratteri CR sono raramente utili ovunque e non possono apparire negli URL in ogni caso, quindi è necessario rimuoverli.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | …
Nel caso in cui il file di input sia ben formato e termina con una nuova riga, viene echo
aggiunta una riga vuota aggiuntiva. Poiché gli URL non possono essere vuoti, ignora solo le righe vuote.
Si noti inoltre che read
non legge le righe in modo semplice. Ignora gli spazi bianchi iniziali e finali, che per un URL è probabilmente desiderabile. Tratta la barra rovesciata alla fine di una linea come un carattere di escape, facendo sì che la linea successiva venga unita al primo meno la sequenza barra rovesciata-newline, il che non è assolutamente desiderabile. Quindi dovresti passare l' -r
opzione a read
. È molto, molto raro read
essere la cosa giusta piuttosto che read -r
.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | while read -r url
do
if [ -z "$url" ]; then continue; fi
…
done