Quelqu'un pourrait-il s'il vous plaît expliquer comment le code suivant fonctionne?
echo '1 2 3 4 5 6' | while read a b c
do
echo $c $b $a
done
Plus précisément, j'aimerais savoir pourquoi la sortie de cette boucle est 3 4 5 6 2 1
au lieu de 3 2 1
et 6 5 4
sur deux lignes distinctes? Je n'arrive pas à penser à cela…
Réécrire la boucle de cette façon révèle ce qui se passe:
Cela donne, en sortie:
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 fonctionread
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 variablesa
etb
prennent les valeurs1
et2
respectivement, tandis quec
prend la valeur3 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). Laread
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 , onread
va toujours (essayer de) lire toute une ligne - et celaread
doit être utilisable à la fois avec et sans boucle.la source
while
cela ne servait pas son objectif habituel dans cet exemple, mais ensuite laread
commande m'a renvoyé ... D'une manière ou d'une autre, je l'ai interprété comme "tant que ceread a b c
n'est pas faux, faisecho ...
". Merci d'avoir expliqué comment cela fonctionnait vraiment. Je suis tombé sur ce code hier et je savais que cela m'ennuierait jusqu'à ce que je le découvre ... lolread a b c
vraie et la condition de la boucle (read a b c
) s'exécute plus d'une fois. Bit, il s’évalue seulement à vrai la 1ère fois. Pour la deuxième fois, il n'y a plus d'entrées à lire dans le canal, ce qui provoque la fin du fichierread
et renvoie false . (help read
Pour plus de détails, reportez-vous à la dernière section de la sortie de "État de sortie", en notant que, dans les scripts shell, zéro signifie vrai et non nul veut dire faux.) Si vous transmettez plus d'une ligne d'entréewhile read ...
, le corps de la boucle être exécuté plusieurs fois.