Menulis ulang loop dengan cara ini mengungkapkan apa yang terjadi:
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
Ini memberi, sebagai hasilnya:
(iteration beginning) a=1 b=2 c=3 4 5 6 (iteration ending)
Perhatikan dulu bahwa hanya satu perintah gema yang dijalankan. Jika dijalankan lebih dari satu kali, Anda akan, antara lain, melihat (iteration beginning)dan (iteration ending)substring dicetak lebih dari sekali.
Ini untuk mengatakan bahwa memiliki whileloop di sini tidak benar-benar mencapai apa pun. The readbuiltin membaca spasi dipisahkan teks 1 ke masing-masing variabel tertentu. Input ekstra ditambahkan ke bagian akhir variabel terakhir yang ditentukan. 2 Dengan demikian variabel adan bmengambil nilai-nilai 1dan 2masing - masing, sementara cmengambil nilai 3 4 5 6.
Ketika kondisi loop ( while read a b c) dievaluasi untuk kedua kalinya, tidak ada lagi input yang tersedia dari pipa (kami hanya memipipkannya satu baris teks), sehingga readperintah mengevaluasi ke false sebagai ganti true dan loop berhenti (sebelum pernah menjalankan tubuh kedua kalinya).
1 : Untuk teknis dan spesifik, yang readbuiltin , ketika melewati nama variabel sebagai argumen, membaca masukan, membelah menjadi terpisah "kata" ketika pertemuan IFS spasi (lihat juga pertanyaan ini dan artikel ini ).
2 : readPerilaku macet bidang input tambahan ke variabel terakhir yang ditentukan pada awalnya tidak intuitif untuk banyak skrip. Menjadi lebih mudah untuk dipahami ketika Anda mempertimbangkan bahwa, seperti jawaban Florian Diesch mengatakan , readakan selalu (mencoba) membaca seluruh baris - dan itu readdimaksudkan agar dapat digunakan baik dengan dan tanpa loop.