Par définition , un fichier texte se compose d'une séquence de lignes. Une ligne se termine par un caractère de nouvelle ligne. Ainsi, un fichier texte se termine par un caractère de nouvelle ligne, sauf s'il est vide.
La fonction read
intégrée est uniquement destinée à lire des fichiers texte. Vous ne passez pas un fichier texte, vous ne pouvez donc pas espérer qu'il fonctionne de manière transparente. Le shell lit toutes les lignes - ce qu'il saute sont les caractères supplémentaires après la dernière ligne.
Si vous avez un fichier d'entrée potentiellement mal formé qui peut manquer sa dernière ligne, vous pouvez lui ajouter une nouvelle ligne, juste pour être sûr.
{ cat "/tmp/urlFile"; echo; } | …
Les fichiers qui devraient être des fichiers texte mais qui manquent la nouvelle ligne finale sont souvent produits par les éditeurs de Windows. Cela va généralement en combinaison avec les fins de ligne Windows, qui sont CR LF, par opposition au LF d'Unix. Les caractères CR sont rarement utiles n'importe où et ne peuvent en aucun cas apparaître dans les URL, vous devez donc les supprimer.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | …
Dans le cas où le fichier d'entrée est bien formé et se termine par une nouvelle ligne, l' echo
ajoute une ligne vierge supplémentaire. Étant donné que les URL ne peuvent pas être vides, ignorez simplement les lignes vides.
Notez également que read
ne lit pas les lignes d'une manière simple. Il ignore les espaces de début et de fin, ce qui est probablement souhaitable pour une URL. Il traite la barre oblique inversée à la fin d'une ligne comme un caractère d'échappement, provoquant la jonction de la ligne suivante avec la première moins la séquence barre oblique inverse-nouvelle ligne, ce qui n'est certainement pas souhaitable. Vous devez donc transmettre l' -r
option à read
. Il est très, très rare que ce read
soit la bonne chose read -r
.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | while read -r url
do
if [ -z "$url" ]; then continue; fi
…
done