Por definición , un archivo de texto consiste en una secuencia de líneas. Una línea termina con un carácter de nueva línea. Por lo tanto, un archivo de texto termina con un carácter de nueva línea, a menos que esté vacío.
El read
builtin solo está destinado a leer archivos de texto. No está pasando un archivo de texto, por lo que no puede esperar que funcione sin problemas. El shell lee todas las líneas; lo que se salta son los caracteres adicionales después de la última línea.
Si tiene un archivo de entrada potencialmente malformado que le puede faltar su última línea, puede agregarle una nueva línea, solo para estar seguro.
{ cat "/tmp/urlFile"; echo; } | …
Los archivos que deberían ser archivos de texto pero que faltan en la nueva línea final a menudo son producidos por editores de Windows. Esto generalmente se combina con las terminaciones de línea de Windows, que son CR LF, en oposición a las LF de Unix. Los caracteres CR rara vez son útiles en cualquier lugar, y no pueden aparecer en las URL en ningún caso, por lo que debe eliminarlos.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | …
En caso de que el archivo de entrada esté bien formado y termine con una nueva línea, echo
agrega una línea en blanco adicional. Como las URL no pueden estar vacías, simplemente ignore las líneas en blanco.
Tenga en cuenta también que read
no lee líneas de una manera directa. Ignora los espacios en blanco iniciales y finales, lo que para una URL es probablemente deseable. Trata la barra invertida al final de una línea como un carácter de escape, lo que hace que la siguiente línea se una con la primera menos la secuencia barra invertida-nueva línea, lo que definitivamente no es deseable. Por lo tanto, debe pasar la -r
opción a read
. Es muy, muy raro read
que sea lo correcto en lugar de hacerlo read -r
.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | while read -r url
do
if [ -z "$url" ]; then continue; fi
…
done