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 read
retourne 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 read
peut ê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 <&3
plutôt.)