เป็น ((…)) {…;} ไวยากรณ์เชลล์ที่ถูกต้องหรือไม่ หอยไหน?


21

การแสดงออก:

$ ksh -c 'for ((i=0;i<10;i++)){ echo $i;}'
0
1
2
3
4

ทำงานอย่างถูกต้อง

ฉันล้มเหลวในการค้นหาคำอธิบายของไวยากรณ์นี้ซึ่ง{...;}แทนที่ด้วย; do ...; doneในคู่มือ

มีการอ้างอิงในคู่มือหรือไม่? เชลล์ใดที่ทำงานได้ถูกต้อง?


คำตอบ:


30

{ ...; }ได้รับการยอมรับแล้วแทนที่do ...; doneในforลูปในเวอร์ชันแรกของ Bourne shell ใน Unix V7 ในช่วงปลายยุค 70 (ดูซอร์สโค้ด ) แต่ไม่เคยมีเอกสารรับรองเท่าที่ฉันรู้

ทั้งหมดksh(ทั้งต้นดั้งเดิมมาจากเชลล์เป้าหมายและ ksh93 เขียนใหม่), pdksh¹ (และอนุพันธ์), bash(ตั้งแต่เริ่มต้นในปี 1989) และzshสนับสนุน ฉันไม่รู้เกี่ยวกับashอนุพันธ์ที่ทำ yashไม่อย่างใดอย่างหนึ่ง แต่yashถูกเขียนไปยังมาตรฐาน POSIX

ในzshการสนับสนุนถูกเพิ่มด้วย 2.0 ในปี 1991 แต่เป็นส่วนหนึ่งของรูปแบบสั้นใหม่สำหรับการสร้างส่วนใหญ่ซึ่งเกินกว่าไวยากรณ์บอร์น มันไม่เพียง แต่for i in 1 2; { ...; }เป็นfor i in 1 2; any-command(และตัวแปรของมัน) และมันเป็นเอกสารที่มีและได้รับตั้งแต่การแนะนำของ

AFAIK ข้างๆzshมีเพียง pdksh ที่เป็นเอกสาร (สำหรับทั้งคู่forและselect)

สำหรับ((init; condition; action))รูปแบบที่มาจากksh93และได้รับการคัดลอกโดยและzshbash

ทั้งที่((...))หรือ{ ...; }ในสถานที่do ...; doneที่มี POSIX

ดูเพิ่มเติมวัตถุประสงค์ของคำหลัก "ทำ" ใน Bash สำหรับลูปคืออะไร สำหรับforรูปแบบวงเพิ่มเติม


¹ไม่ใช่เวอร์ชั่นก่อนหน้าหรือ Forsyth shell ที่ใช้ มันถูกเพิ่มเข้ามาใน 5.1.1 ในปี 1994 และนั่นอาจอธิบายได้ว่าทำไมมันจึงถูกบันทึกไว้ที่นั่น


1
ว้าว, นายบอร์นอย่างเต็มที่กอดการใช้งานของค preprocessor ในรหัส 70s แหล่งที่มาว่า
บาดเจ็บทางดิจิตอล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.