Por definição , um arquivo de texto consiste em uma sequência de linhas. Uma linha termina com um caractere de nova linha. Assim, um arquivo de texto termina com um caractere de nova linha, a menos que esteja vazio.
O read
built-in destina-se apenas a ler arquivos de texto. Você não está passando um arquivo de texto, portanto, não pode esperar que ele funcione perfeitamente. O shell lê todas as linhas - o que está pulando são os caracteres extras após a última linha.
Se você tiver um arquivo de entrada potencialmente malformado que pode estar faltando sua última linha, poderá adicionar uma nova linha a ele, apenas para ter certeza.
{ cat "/tmp/urlFile"; echo; } | …
Os arquivos que devem ser arquivos de texto, mas que não possuem a nova linha final, geralmente são produzidos pelos editores do Windows. Isso geralmente ocorre em combinação com as terminações de linha do Windows, que são CR LF, em oposição ao LF do Unix. Os caracteres CR raramente são úteis em qualquer lugar e, em qualquer caso, não podem aparecer nos URLs; portanto, você deve removê-los.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | …
Caso o arquivo de entrada seja bem formado e termine com uma nova linha, isso echo
adiciona uma linha em branco extra. Como os URLs não podem estar vazios, apenas ignore as linhas em branco.
Observe também que read
não lê linhas de maneira direta. Ele ignora os espaços em branco à esquerda e à direita, o que para um URL é provavelmente desejável. Ele trata a barra invertida no final de uma linha como um caractere de escape, fazendo com que a próxima linha seja unida à primeira menos a sequência barra invertida-nova linha, o que definitivamente não é desejável. Então você deve passar a -r
opção para read
. É muito, muito raro read
ser a coisa certa e não read -r
.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | while read -r url
do
if [ -z "$url" ]; then continue; fi
…
done