Przepisanie pętli w ten sposób ujawnia, co się dzieje:
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
Daje to jako wynik:
(iteration beginning) a=1 b=2 c=3 4 5 6 (iteration ending)
Zauważ najpierw, że uruchamiane jest tylko jedno polecenie echa. Gdyby został uruchomiony więcej niż jeden raz, zobaczyłbyś między innymi napisy (iteration beginning)
i (iteration ending)
napisy wydrukowane więcej niż jeden raz.
To znaczy, że while
pętla tutaj tak naprawdę niczego nie osiąga. read
Wbudowane odczytuje białymi oddzielone tekst 1 do każdej zmiennej określonej. Dodatkowe dane wejściowe są dołączane na końcu ostatniej określonej zmiennej. 2 W ten sposób zmienne a
i b
odbioru o wartości 1
i 2
, odpowiednio, a c
przyjmuje wartości 3 4 5 6
.
Gdy warunek pętli ( while read a b c
) jest oceniany po raz drugi, nie ma już żadnych danych wejściowych z potoku (przesłaliśmy do niego tylko jeden wiersz tekstu), więc read
polecenie ocenia na fałsz zamiast prawdy, a pętla zatrzymuje się (przed wykonaniem polecenia ciało po raz drugi).
1 : Aby mieć charakter techniczny i konkretne, wbudowane , gdy przeszedł nazw zmiennych jako argumenty, odczytuje wejścia, dzieląc go na odrębne „słów” , gdy napotka IFS spacje (patrz również na to pytanie i ten artykuł ).read
2 : read
zachowanie polegające na blokowaniu jakichkolwiek dodatkowych pól danych wejściowych w ostatniej określonej zmiennej jest początkowo nieintuicyjne dla wielu skrypterów. Łatwiej jest to zrozumieć, gdy weźmie się pod uwagę, że, jak mówi odpowiedź Floriana Diescha , read
zawsze (spróbuje) przeczytać całą linię - i read
ma to być użyteczne zarówno z pętlą, jak i bez niej.