Bisakah seseorang tolong jelaskan bagaimana kode berikut bekerja?
echo '1 2 3 4 5 6' | while read a b c
do
echo $c $b $a
done
Secara khusus, saya ingin tahu mengapa output dari loop ini 3 4 5 6 2 1
, bukan 3 2 1
dan 6 5 4
pada dua baris terpisah? Sepertinya saya tidak bisa membungkus pikiran saya di sekitarnya ...
Menulis ulang loop dengan cara ini mengungkapkan apa yang terjadi:
Ini memberi, sebagai hasilnya:
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. Theread
builtin membaca spasi dipisahkan teks 1 ke masing-masing variabel tertentu. Input ekstra ditambahkan ke bagian akhir variabel terakhir yang ditentukan. 2 Dengan demikian variabela
danb
mengambil nilai-nilai1
dan2
masing - masing, sementarac
mengambil nilai3 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), sehinggaread
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 ituread
dimaksudkan agar dapat digunakan baik dengan dan tanpa loop.sumber
while
tidak memenuhi tujuan normal dalam contoh ini, tetapi kemudianread
perintah itu mengusir saya ... Entah bagaimana, saya menafsirkannya sebagai "sementararead a b c
tidak salah, lakukanecho ...
". Terima kasih telah menjelaskan cara kerjanya. Saya menemukan kode ini kemarin dan tahu itu akan mengganggu saya sampai saya menemukanread a b c
mengevaluasi ke benar, dan kondisi loop (read a b c
) tidak menjalankan lebih dari sekali. Bit itu hanya bernilai true pertama kali. Kali ke-2, tidak ada lagi input untuk dibaca dari pipa, sehingga akhir file ditemui, menyebabkanread
kembali salah . (Lihat bagian terakhir dari outputhelp read
, pada "Status Keluar," untuk perincian, mencatat bahwa, dalam skrip shell, nol berarti benar dan bukan nol berarti salah.) Jika Anda mengirim lebih dari satu baris input kewhile read ...
, badan loop akan dieksekusi beberapa kali.