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 while
vòng lặp ở đây không thực sự hoàn thành bất cứ điều gì. Nội read
dung 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 a
và b
nhận các giá trị 1
và 2
tươ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 đó read
lệ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 read
BUILTIN , 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 , read
sẽ 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.