Viết lại vòng lặp theo cách này cho thấy những gì đang xảy ra:
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
Điều này mang lại, như đầu ra của nó:
(iteration beginning) a=1 b=2 c=3 4 5 6 (iteration ending)
Đầu tiên lưu ý rằng chỉ có một lệnh echo duy nhất được chạy. Nếu nó được chạy nhiều hơn một lần, trong số những thứ khác, bạn sẽ thấy (iteration beginning)và các (iteration ending)chuỗi con được in nhiều lần.
Điều này để nói rằng có một whilevòng lặp ở đây không thực sự hoàn thành bất cứ điều gì. Nội readdung này đọc văn bản được phân tách bằng khoảng trắng 1 vào mỗi biến được chỉ định. Đầu vào bổ sung được nối vào cuối biến cuối được chỉ định. 2 Do đó, biến avà bnhận các giá trị 1và 2tương ứng, trong khi cđảm nhận giá trị 3 4 5 6.
Khi điều kiện vòng lặp ( while read a b c) được đánh giá lần thứ hai, không có thêm đầu vào nào từ đường ống (chúng tôi chỉ đưa nó vào một dòng văn bản), do đó readlệnh đánh giá thành sai thay vì đúng và vòng lặp dừng (trước khi thực hiện cơ thể lần thứ hai).
1 : Để trở thành kỹ thuật và đặc biệt, các readBUILTIN , khi thông qua tên biến như các đối số, đọc đầu vào, tách nó thành "chữ" riêng biệt khi nó chạm trán IFS khoảng trắng (xem thêm câu hỏi này và bài viết này ).
2 : read's hành vi gây nhiễu bất kỳ trường bổ sung yếu tố đầu vào biến cuối cùng quy định không trực giấc với nhiều scripters, lúc đầu. Sẽ dễ hiểu hơn khi bạn xem xét điều đó, như câu trả lời của Florian Diesch nói , readsẽ luôn luôn (cố gắng) đọc cả một dòng - và điều đó readđược dự định là có thể sử dụng được cả có và không có vòng lặp.