Reescribir el ciclo de esta manera revela lo que está sucediendo:
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
Esto da, como su salida:
(iteration beginning) a=1 b=2 c=3 4 5 6 (iteration ending)
Observe primero que solo se ejecuta un comando echo. Si se ejecutara más de una vez, vería, entre otras cosas, las subcadenas (iteration beginning)
e (iteration ending)
impresas más de una vez.
Esto quiere decir que tener un while
bucle aquí no es realmente lograr nada. El read
archivo incorporado lee el texto separado por espacios en blanco 1 en cada variable especificada. La entrada adicional se agrega al final de la última variable especificada. 2 Así, las variables a
y b
toman los valores 1
y 2
respectivamente, mientras que c
toman el valor 3 4 5 6
.
Cuando la condición del bucle ( while read a b c
) se evalúa por segunda vez, no hay más entradas disponibles desde la tubería (solo lo canalizamos una sola línea de texto), por lo que el read
comando se evalúa como falso en lugar de verdadero y el bucle se detiene (antes de ejecutar el cuerpo por segunda vez).
1 : Para ser técnico y específico, el read
incorporado , cuando pasa los nombres de las variables como argumentos, lee la entrada, dividiéndola en "palabras" separadas cuando encuentra espacios en blanco IFS (vea también esta pregunta y este artículo ).
2 : read
el comportamiento de bloquear cualquier campo adicional de entrada en la última variable especificada no es intuitivo para muchos scripters, al principio. Se vuelve más fácil de entender cuando se considera que, como dice la respuesta de Florian Diesch , read
siempre (intentará) leer una línea completa, y que read
está destinada a ser utilizable con y sin bucle.