การแสดงออก:
$ 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และได้รับการคัดลอกโดยและzshbash
ทั้งที่((...))หรือ{ ...; }ในสถานที่do ...; doneที่มี POSIX
ดูเพิ่มเติมวัตถุประสงค์ของคำหลัก "ทำ" ใน Bash สำหรับลูปคืออะไร สำหรับforรูปแบบวงเพิ่มเติม
¹ไม่ใช่เวอร์ชั่นก่อนหน้าหรือ Forsyth shell ที่ใช้ มันถูกเพิ่มเข้ามาใน 5.1.1 ในปี 1994 และนั่นอาจอธิบายได้ว่าทำไมมันจึงถูกบันทึกไว้ที่นั่น