วัตถุประสงค์ของdo
คำหลักในfor
ไวยากรณ์วนซ้ำคืออะไร สำหรับฉันมันรู้สึกซ้ำซ้อน
for i in `seq 1 2`; do echo "hi"; done
ทำไมไวยากรณ์ไม่เป็นแบบนี้
for i in `seq 1 2`; echo "hi"; done
ฉันแน่ใจว่ามันไม่กรอกวัตถุประสงค์ ฉันแค่ต้องการเรียนรู้
วัตถุประสงค์ของdo
คำหลักในfor
ไวยากรณ์วนซ้ำคืออะไร สำหรับฉันมันรู้สึกซ้ำซ้อน
for i in `seq 1 2`; do echo "hi"; done
ทำไมไวยากรณ์ไม่เป็นแบบนี้
for i in `seq 1 2`; echo "hi"; done
ฉันแน่ใจว่ามันไม่กรอกวัตถุประสงค์ ฉันแค่ต้องการเรียนรู้
คำตอบ:
โปรดทราบว่าไวยากรณ์นั้นสืบทอดมาจากเชลล์เป้าหมาย
หลังจากชื่อตัวแปรคุณสามารถมีin
รายการขององค์ประกอบที่กำหนดไว้อย่างชัดเจนหรือdo
เพื่อวนรอบพารามิเตอร์ตำแหน่ง
for i in 1 2 3
do
echo "$i"
done
หรือ
set 1 2 3
for i do
echo "$i"
done
การมีdo
ทั้งสองกรณี (แม้ว่าจะไม่จำเป็นอย่างยิ่งในกรณีแรก) จะทำให้ไวยากรณ์มีความสอดคล้องกันมากขึ้น นอกจากนี้ยังสอดคล้องกับwhile
/ until
ลูปที่do
จำเป็น
while
cmd1
cmd2
do
cmd3
cmd4
done
คุณต้องการที่do
จะบอกว่ารายการคำสั่งเงื่อนไขสิ้นสุดลงที่ใด
for i; do
โปรดทราบว่าเปลือกบอร์นไม่ได้สนับสนุน ไวยากรณ์นั้นยังไม่ได้ POSIX จนกว่ามาตรฐานรุ่นปี 2016 ( for i do
เป็น POSIX เสมอดูข้อบกพร่องของกลุ่ม Austin ที่เกี่ยวข้อง )
zsh
มีรูปแบบย่อบางอย่างเช่น:
for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i
หรือสนับสนุนตัวแปรมากกว่าหนึ่งตัว:
for i j (1 a 2 b) echo $i $j
(แม้ว่าคุณจะไม่สามารถใช้in
หรือdo
เป็นชื่อตัวแปรแทนตำแหน่งj
ด้านบน)
แม้ว่าไม่ค่อยเอกสารส่วนใหญ่เปลือกหอยบอร์นเหมือน (บอร์ ksh, ทุบตี zsh ไม่ash
ว่ามิได้yash
) นอกจากนี้ยังสนับสนุน:
for i in 1 2 3; { echo "$i";}
เชลล์เป้าหมายksh
และzsh
(แต่ไม่ใช่bash
) รองรับเช่นกัน:
for i { echo "$i"; }
ในขณะที่bash
, ksh
และzsh
( แต่ไม่บอร์นเชลล์) การสนับสนุน:
for i; { echo "$i"; }
ทั้งหมด (บอร์นbash
, ksh
, zsh
) การสนับสนุน:
for i
{ echo "$i";}
ksh93
, bash
, zsh
การสนับสนุน:
for ((i=1;i<=3;i++)) { echo "$i"; }
for
; คำสั่งอาจถูกยกเลิกโดย newline หรือ semicolon มันค่อนข้างสมเหตุสมผลสำหรับif
/ while
(อดีตที่มีthen
มากกว่าdo
) แต่โดยหลักการแล้วผู้ใช้สามารถละเว้นมันและจำเป็นต้องใช้ subshell หรือวงเล็บปีกกาสำหรับการใช้ (คำสั่ง) ที่หายากของคำสั่งหลายรายการ ฉันสงสัยว่าเหตุผลที่แท้จริงว่าเปลือกบอร์นไม่ได้เป็นเพราะ ALGOL ไม่มันและเราควรจะดีใจที่ไม่ได้สะกดdone
od
od
เคยใช้เป็นชื่อของโปรแกรม Octal Dump แล้ว
for i do
เป็น Bourne และ POSIX แต่จะไม่ทำงานใน IIRC เวอร์ชันเก่าที่ใช้ขี้เถ้า for i in "$@"
จะไม่ทำงานในเชลล์เป้าหมายหาก$IFS
ไม่มีอักขระช่องว่าง for i<newline>do
แน่นอนพกพามากที่สุดหากคุณต้องการพิจารณาระบบ BSD ที่เก่ามาก ดูรายละเอียดได้ที่in-ulm.de/~mascheck/various/bourne_args