Réécrire la boucle de cette façon révèle ce qui se passe:
echo '1 2 3 4 5 6' | while read a b c
do
echo '(iteration beginning)' a="$a" b="$b" c="$c" '(iteration ending)'
done
Cela donne, en sortie:
(iteration beginning) a=1 b=2 c=3 4 5 6 (iteration ending)
Notez tout d’abord que seule une commande echo est exécutée. S'il était exécuté plus d'une fois, vous verriez entre autres le (iteration beginning)
et les (iteration ending)
sous - chaînes imprimées plus d'une fois.
Cela revient à dire qu'avoir une while
boucle ici n'apporte vraiment rien. La fonction read
intégrée lit le texte 1 séparé par des espaces dans chaque variable spécifiée. Une entrée supplémentaire est ajoutée à la fin de la dernière variable spécifiée. 2 Ainsi, les variables a
et b
prennent les valeurs 1
et 2
respectivement, tandis que c
prend la valeur 3 4 5 6
.
Lorsque la condition de boucle ( while read a b c
) est évaluée pour la deuxième fois, il n’ya plus d’entrée disponible dans le tube (nous lui avons simplement acheminé une seule ligne de texte). La read
commande est donc évaluée à false au lieu de true et la boucle s’arrête corps une seconde fois).
1 : Pour être technique et spécifique, la commande read
intégrée , lorsqu'elle transmet des noms de variable en tant qu'arguments, lit les entrées en les séparant en "mots" distincts lorsqu'elle rencontre des espaces IFS (voir aussi cette question et cet article ).
read
Le comportement de 2 : le fait de coincer tout champ supplémentaire d’entrée dans la dernière variable spécifiée est peu intuitif pour beaucoup de scripteurs, au début. Il devient plus facile de comprendre quand on considère que, comme le dit la réponse de Florian Diesch , on read
va toujours (essayer de) lire toute une ligne - et cela read
doit être utilisable à la fois avec et sans boucle.