Ce qui suit lit un fichier passé en argument ligne par ligne:
while IFS= read -r line; do
echo "Text read from file: $line"
done < my_filename.txt
Il s'agit du formulaire standard pour lire les lignes d'un fichier dans une boucle. Explication:
IFS=(ou IFS='') empêche la suppression des espaces de début / fin.
-r empêche les échappements antislash d'être interprétés.
Ou vous pouvez le mettre dans un script d'aide de fichier bash, exemple de contenu:
#!/bin/bash
while IFS= read -r line; do
echo "Text read from file: $line"
done < "$1"
Si ce qui précède est enregistré dans un script avec un nom de fichier readfile, il peut être exécuté comme suit:
chmod +x readfile
./readfile filename.txt
Si le fichier n'est pas un fichier texte POSIX standard (= non terminé par un caractère de nouvelle ligne), la boucle peut être modifiée pour gérer les lignes partielles de fin:
while IFS= read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
done < "$1"
Ici, || [[ -n $line ]]empêche la dernière ligne d'être ignorée si elle ne se termine pas par un \n(car readretourne un code de sortie différent de zéro lorsqu'il rencontre EOF).
Si les commandes à l'intérieur de la boucle lisent également à partir de l'entrée standard, le descripteur de fichier utilisé par readpeut être remplacé par quelque chose d'autre (éviter les descripteurs de fichier standard ), par exemple:
while IFS= read -r -u3 line; do
echo "Text read from file: $line"
done 3< "$1"
(Les obus non-Bash peuvent ne pas savoir read -u3; utilisez read <&3plutôt.)