การแสดงออก:
$ ksh -c 'for ((i=0;i<10;i++)){ echo $i;}'
0
1
2
3
4
ทำงานอย่างถูกต้อง
ฉันล้มเหลวในการค้นหาคำอธิบายของไวยากรณ์นี้ซึ่ง{...;}
แทนที่ด้วย; do ...; done
ในคู่มือ
มีการอ้างอิงในคู่มือหรือไม่? เชลล์ใดที่ทำงานได้ถูกต้อง?
การแสดงออก:
$ ksh -c 'for ((i=0;i<10;i++)){ echo $i;}'
0
1
2
3
4
ทำงานอย่างถูกต้อง
ฉันล้มเหลวในการค้นหาคำอธิบายของไวยากรณ์นี้ซึ่ง{...;}
แทนที่ด้วย; do ...; done
ในคู่มือ
มีการอ้างอิงในคู่มือหรือไม่? เชลล์ใดที่ทำงานได้ถูกต้อง?
คำตอบ:
{ ...; }
ได้รับการยอมรับแล้วแทนที่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
และได้รับการคัดลอกโดยและzsh
bash
ทั้งที่((...))
หรือ{ ...; }
ในสถานที่do ...; done
ที่มี POSIX
ดูเพิ่มเติมวัตถุประสงค์ของคำหลัก "ทำ" ใน Bash สำหรับลูปคืออะไร สำหรับfor
รูปแบบวงเพิ่มเติม
¹ไม่ใช่เวอร์ชั่นก่อนหน้าหรือ Forsyth shell ที่ใช้ มันถูกเพิ่มเข้ามาใน 5.1.1 ในปี 1994 และนั่นอาจอธิบายได้ว่าทำไมมันจึงถูกบันทึกไว้ที่นั่น