การเขียนวนซ้ำด้วยวิธีนี้จะเผยให้เห็นสิ่งที่เกิดขึ้น:
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
สิ่งนี้จะให้เป็นเอาท์พุท:
(iteration beginning) a=1 b=2 c=3 4 5 6 (iteration ending)
ขอให้สังเกตก่อนว่ามีเพียงคำสั่ง echo เดียวเท่านั้นที่รัน หากมีการเรียกใช้มากกว่าหนึ่งครั้งคุณจะเห็นสิ่งที่พิมพ์(iteration beginning)
และวัสดุ(iteration ending)
พิมพ์มากกว่าหนึ่งครั้ง
นี่คือการพูดว่าการwhile
วนซ้ำที่นี่ไม่ได้สำเร็จอะไรเลย read
builtin อ่านช่องว่างที่คั่นข้อความ1ลงในตัวแปรที่ระบุไว้ในแต่ละ อินพุตพิเศษจะถูกต่อท้ายส่วนท้ายของตัวแปรสุดท้ายที่ระบุ 2ดังนั้นตัวแปรa
และb
ใช้เวลาในการค่า1
และ2
ตามลำดับในขณะที่ใช้เวลาในค่าc
3 4 5 6
เมื่อเงื่อนไขลูป ( while read a b c
) ถูกประเมินเป็นครั้งที่สองจะไม่มีอินพุตอีกต่อไปจากไพพ์ (เราเพียงไพพ์มันเป็นข้อความบรรทัดเดียว) ดังนั้นread
คำสั่งจะประเมินเป็นเท็จแทนที่จะเป็นจริงและลูปหยุด (ก่อนที่จะรัน ร่างกายเป็นครั้งที่สอง)
1 : เพื่อเป็นทางด้านเทคนิคและเฉพาะbuiltinเมื่อผ่านชื่อตัวแปรเป็นอาร์กิวเมนต์อ่านอินพุตแยกมันกลายเป็น "คำว่า" แยกจากกันเมื่อพบไอเอฟเอช่องว่าง (เห็นคำถามนี้และบทความนี้ )read
2 : read
พฤติกรรมของการติดขัดของช่องพิเศษของการป้อนข้อมูลลงในตัวแปรสุดท้ายที่ระบุไม่ได้ใช้งานได้ง่ายเพื่อ Scripters จำนวนมากในตอนแรก มันกลายเป็นเรื่องง่ายที่จะเข้าใจเมื่อคุณพิจารณาว่าเป็นคำตอบ Florian Diesch กล่าวว่า , read
มักจะ (พยายาม) อ่านบรรทัดทั้งหมด - และที่read
มีจุดมุ่งหมายที่จะใช้งานได้ทั้งที่มีและไม่มีห่วง