[SHELL] Comment lire/parcourir un fichier ?
Si vous souhaitez réutiliser uniquement la première ligne d'un fichier :
Code:
1 2
| $ read premiR_Ligne < fichier
$ echo "$premiR_Ligne" |
le contenu de 'fichier' est redirigé vers la commande read, qui va placer ce qu'elle a lu dans une variable; ici, j'ai choisi le nom premiR_Ligne.
Pour lire tout le contenu du fichier, on utilisera une boucle while :
Code:
1 2 3
| while read Ligne
do echo "$Ligne"
done < fichier |
Il est possible de découper la ligne en autant de variables que nécessaire :
Code:
1 2 3 4
| while read champ1 champ2 toutLeReste
do line="$champ1 $champ2 $toutLeReste"
echo "$line"
done < fichier |
Les lignes d'un fichier peuvent commencer par des espaces, mais les codes précédents n'ont tiendront pas compte.
Il y a deux façons de préserver ces espaces :
Code:
while read; do echo "$REPLY"; done
où REPLY est le nom de variable par défaut quand aucun nom de variable n'est indiqué à read.
ou, vous pouvez modifier l'environnement de la commande read en adaptant l'IFS (Internal Field Separator) en lui assignant une valeur nulle :
Code:
while IFS='' read line; do echo "$line"; done
Si vous avez besoin de découper la ligne en fonction du formatage d'un fichier (CSV, par exemple),
l'IFS peut être adapté pour correspondre au séparateur de champs du fichier :
Code:
1 2 3 4
| while IFS=';' read champ1 champ2 toutLeReste
do line="$champ1 $champ2 $toutLeReste"
echo "$line"
done < fichier.csv |
vous pourriez utiliser un tableau :
Code:
1 2 3
| while IFS=';' read -a Array
do echo "${Arrray[@]}"
done < fichier.csv |
ou les paramètres positionnels :
Code:
1 2 3 4 5
| commandeQuiSortDuCSV | while read Ligne
do IFS=';'
set -- $Ligne
echo "$@"
done |
l'IFS, et les paramètres positionnels du script sont conservés intacts, car le pipe crée un sous-shell en dehors duquel les variables créées (ou modifiées) n'existent pas.