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 while
loop di sini tidak benar-benar mencapai apa pun. The read
builtin membaca spasi dipisahkan teks 1 ke masing-masing variabel tertentu. Input ekstra ditambahkan ke bagian akhir variabel terakhir yang ditentukan. 2 Dengan demikian variabel a
dan b
mengambil nilai-nilai 1
dan 2
masing - masing, sementara c
mengambil 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 read
perintah mengevaluasi ke false sebagai ganti true dan loop berhenti (sebelum pernah menjalankan tubuh kedua kalinya).
1 : Untuk teknis dan spesifik, yang read
builtin , ketika melewati nama variabel sebagai argumen, membaca masukan, membelah menjadi terpisah "kata" ketika pertemuan IFS spasi (lihat juga pertanyaan ini dan artikel ini ).
2 : read
Perilaku 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 , read
akan selalu (mencoba) membaca seluruh baris - dan itu read
dimaksudkan agar dapat digunakan baik dengan dan tanpa loop.