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 whilepętla tutaj tak naprawdę niczego nie osiąga. readWbudowane 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 ai bodbioru o wartości 1i 2, odpowiednio, a cprzyjmuje 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 readpolecenie 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 : readzachowanie 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 , readzawsze (spróbuje) przeczytać całą linię - i readma to być użyteczne zarówno z pętlą, jak i bez niej.