Question 1Comment while read line; do … done < file traite-t-il file ?
Lire une entrée — traiter ligne par ligne avec while read
Cet article fait partie du Cours Linux, qui vous permet de maîtriser à partir de zéro des compétences Linux concrètes, des commandes de base jusqu'aux scripts shell.
Avec while read name age, traite data.txt ligne par ligne et range chaque colonne, avec for f in "$@" parcours plusieurs fichiers passés en arguments, et passe une entrée à read via un pipe ou un here-doc — illustré et pratiqué dans un terminal en navigateur.
Lire un fichier ligne par ligne — while read
Il arrive souvent que tu veuilles traiter une liste ou un fichier de configuration ligne par ligne.
Si tu écris while read line; do … done < file, file est lu de haut en bas une ligne à la fois, chaque ligne est placée dans la variable line, et le contenu de do … done est répété.
Quel que soit le nombre de lignes du fichier, la boucle va automatiquement jusqu'à la dernière ligne.
read découpe la ligne reçue sur les espaces et peut la répartir dans plusieurs variables.
Si tu écris while read name age; do …, le premier mot de chaque ligne va dans name et le mot suivant dans age.
Pour des données du type « nom valeur » comme une liste, tu peux extraire chaque colonne et la mettre en forme.
printf 'web running\ndb stopped\n' > services.txt # créer la matière
while read svc state; do # une ligne à la fois vers svc et state
echo "Service $svc est $state"
done < services.txt # services.txt en entrée
# Sortie : Service web est running / Service db est stopped
while read name age lit le fichier ligne par ligne et, en découpant sur les espaces, met le premier mot dans name et le suivant dans age.| Syntaxe | Signification | Exemple |
|---|---|---|
while read v; do … done < f | Traiter le fichier f ligne par ligne avec la variable v | while read l; do echo "$l"; done < data.txt |
while read a b; do … | Découper une ligne sur les espaces vers plusieurs variables | while read name age; do echo "$name"; done < data.txt |
Recevoir plusieurs fichiers en arguments — "$@" et $(cat f)
Si tu codes en dur le nom du fichier à traiter dans le script, tu ne peux pas l'utiliser sur un autre fichier.
Si tu le passes à l'exécution comme ./show.sh a.txt b.txt, $1 est le premier argument et $2 le deuxième.
Tous les arguments se reçoivent d'un coup avec "$@".
Si tu écris for f in "$@"; do … done, tu peux placer chaque fichier passé un par un dans f et les traiter dans l'ordre.
Quand tu veux utiliser tout le contenu d'un fichier comme une seule chaîne, prends-le dans une variable avec text=$(cat "$f").
Le nombre d'arguments se connaît avec $#, et tu peux faire en sorte qu'avec 0 argument le script affiche son mode d'emploi.
printf 'line A1\nline A2\n' > a.txt # matière 1
printf 'line B1\n' > b.txt # matière 2
vi show.sh # ouvrir dans l'éditeur, écrire ce qui suit et enregistrer avec :wq
# #!/bin/sh
# for f in "$@"; do
# echo "--- $f ---"
# cat "$f"
# done
chmod +x show.sh
./show.sh a.txt b.txt # afficher dans l'ordre les 2 fichiers avec un titre
$1 $2, et avec "$@" tu les reçois d'un coup pour les traiter un par un avec for.| Syntaxe | Signification | Exemple |
|---|---|---|
for f in "$@"; do … | Traiter dans l'ordre chaque fichier des arguments | for f in "$@"; do cat "$f"; done |
$(cat f) | Prendre tout le contenu du fichier dans une seule chaîne | text=$(cat data.txt) |
$# | Le nombre d'arguments (si 0, afficher le mode d'emploi) | [ "$#" -eq 0 ] && echo usage |
Entrée interactive et entrée par pipe — read et here-doc
read ne lit pas que des fichiers : il lit aussi ce qu'une personne tape ou ce qui est passé par un pipe.
Il y a des formes comme relier par un pipe avec echo hi | read v, ou passer d'un coup l'entrée du moment avec le here-doc <<'EOF' … EOF.
C'est la base pour combiner ton script avec d'autres commandes.
# lire ligne par ligne la sortie d'un pipe
printf 'one\ntwo\n' | while read v; do echo "ligne : $v"; done
# passer l'entrée du moment avec un here-doc
while read v; do echo "valeur : $v"; done <<'EOF'
x
y
EOF
# saisie manuelle une seule fois (tape name puis Entrée)
# une fois lancé, il attend l'entrée
read name; echo "Bonjour $name"
while read via un pipe ou un here-doc.| Syntaxe | Signification | Exemple |
|---|---|---|
cmd | while read v; do … | Traiter ligne par ligne la sortie d'un pipe | cat data.txt | while read l; do echo "$l"; done |
<<'EOF' … EOF | Passer l'entrée du moment avec un here-doc | while read l; do echo "$l"; done <<'EOF' |
Vérification des connaissances
Répondez à chaque question une par une.
Question 2Quelle est la façon d'écrire qui représente d'un coup tous les arguments passés au script ?
Question 3Comment traiter ligne par ligne avec read la sortie d'une commande sans créer de fichier ?