<ก่อนหน้านี้ | เนื้อหา | ถัดไป>
สำหรับ: แบบเปลือกหอยแบบดั้งเดิม
ต้นฉบับ for ไวยากรณ์ของคำสั่งคือ:
for ตัวแปร [ใน คำ]; ทำ
คำสั่ง
ทำ
ที่ไหน ตัวแปร เป็นชื่อของตัวแปรที่จะเพิ่มขึ้นในระหว่างการดำเนินการวนซ้ำ คำ เป็นรายการทางเลือกของรายการที่จะกำหนดตามลำดับไปยัง ตัวแปรและ คำสั่ง เป็นคำสั่งที่ต้องดำเนินการในการวนซ้ำแต่ละครั้ง
พื้นที่ for คำสั่งมีประโยชน์บนบรรทัดคำสั่ง เราสามารถสาธิตวิธีการทำงานได้อย่างง่ายดาย:
[me@linuxbox ~]$ สำหรับฉันใน ABCD; ทำ echo $i; เสร็จแล้ว
เอบีซีดี
[me@linuxbox ~]$ สำหรับฉันใน ABCD; ทำ echo $i; เสร็จแล้ว
เอบีซีดี
ในตัวอย่างนี้ for มีรายการคำสี่คำ: "A", "B", "C" และ "D" ด้วยรายการคำสี่คำ การวนซ้ำจะดำเนินการสี่ครั้ง ทุกครั้งที่ดำเนินการวนซ้ำ คำจะถูกกำหนดให้กับตัวแปร i. ภายในลูป เรามี เสียงสะท้อน คำสั่งที่แสดงค่าของ i เพื่อแสดงงาน เช่นเดียวกับ ในขณะที่ และ จนกระทั่ง ลูป, the ทำ คีย์เวิร์ดปิดลูป
คุณสมบัติที่ทรงพลังจริงๆของ for คือจำนวนวิธีที่น่าสนใจที่เราสามารถสร้างรายการคำศัพท์ได้ ตัวอย่างเช่น ผ่านการขยายวงเล็บปีกกา:
[me@linuxbox ~]$ สำหรับฉันใน {A..D}; ทำ echo $i; เสร็จแล้ว
เอบีซีดี
[me@linuxbox ~]$ สำหรับฉันใน {A..D}; ทำ echo $i; เสร็จแล้ว
เอบีซีดี
หรือการขยายชื่อพาธ:
[me@linuxbox ~]$ สำหรับฉันใน distros*.txt; ทำ echo $i; เสร็จแล้ว
distros-by-date.txt distros-dates.txt distros-key-names.txt distros-key-vernums.txt distros-names.txt distros.txt
distros-vernums.txt distros-versions.txt
[me@linuxbox ~]$ สำหรับฉันใน distros*.txt; ทำ echo $i; เสร็จแล้ว
distros-by-date.txt distros-dates.txt distros-key-names.txt distros-key-vernums.txt distros-names.txt distros.txt
distros-vernums.txt distros-versions.txt
หรือคำสั่งทดแทน:
#! / bin / ทุบตี
# longest-word: ค้นหาสตริงที่ยาวที่สุดในไฟล์ในขณะที่ [[ -n $1 ]]; ทำ
ถ้า [[ -r $1 ]]; แล้ว max_word= max_len=0
สำหรับฉันใน $(สตริง $1); ทำ len=$(echo -n $i | wc -c)
ถ้า (( len > max_len )); แล้ว max_len=$len max_word=$i
fi
ทำ
echo "$1: '$max_word' (อักขระไม่เกิน $max_len)"
fi กะ
ทำ
#! / bin / ทุบตี
# longest-word: ค้นหาสตริงที่ยาวที่สุดในไฟล์ในขณะที่ [[ -n $1 ]]; ทำ
ถ้า [[ -r $1 ]]; แล้ว max_word= max_len=0
สำหรับฉันใน $(สตริง $1); ทำ len=$(echo -n $i | wc -c)
ถ้า (( len > max_len )); แล้ว max_len=$len max_word=$i
fi
ทำ
echo "$1: '$max_word' (อักขระไม่เกิน $max_len)"
fi กะ
ทำ
สำหรับ: แบบเปลือกหอยแบบดั้งเดิม
ในตัวอย่างนี้ เรามองหาสตริงที่ยาวที่สุดที่พบในไฟล์ เมื่อได้รับชื่อไฟล์ตั้งแต่หนึ่งชื่อขึ้นไปบนบรรทัดคำสั่ง โปรแกรมนี้จะใช้ เงื่อนไข โปรแกรม (ซึ่งรวมอยู่ในแพ็คเกจ GNU binutils) เพื่อสร้างรายการ "คำ" ของข้อความที่อ่านได้ในแต่ละไฟล์ NS for วนรอบประมวลผลแต่ละคำและกำหนดว่าคำปัจจุบันเป็นคำที่ยาวที่สุดเท่าที่พบ เมื่อการวนซ้ำสิ้นสุดลง คำที่ยาวที่สุดจะปรากฏขึ้น
ถ้าตัวเลือก in คำ ส่วนหนึ่งของ for ละเว้นคำสั่ง for ค่าเริ่มต้นในการประมวลผลพารามิเตอร์ตำแหน่ง เราจะปรับเปลี่ยน .ของเรา คำที่ยาวที่สุด สคริปต์เพื่อใช้วิธีนี้:
#! / bin / ทุบตี
# longest-word2: ค้นหาสตริงที่ยาวที่สุดในไฟล์สำหรับ i; ทำ
ถ้า [[ -r $i ]]; แล้ว max_word= max_len=0
สำหรับ j ใน $(สตริง $i); ทำ len=$(echo -n $j | wc -c)
ถ้า (( len > max_len )); แล้ว max_len=$len max_word=$j
fi
ทำ
echo "$i: '$max_word' (อักขระไม่เกิน $max_len)"
เสร็จแล้ว
#! / bin / ทุบตี
# longest-word2: ค้นหาสตริงที่ยาวที่สุดในไฟล์สำหรับ i; ทำ
ถ้า [[ -r $i ]]; แล้ว max_word= max_len=0
สำหรับ j ใน $(สตริง $i); ทำ len=$(echo -n $j | wc -c)
ถ้า (( len > max_len )); แล้ว max_len=$len max_word=$j
fi
ทำ
echo "$i: '$max_word' (อักขระไม่เกิน $max_len)"
เสร็จแล้ว
อย่างที่เห็น เราได้เปลี่ยนวงนอกสุดไปใช้ for แทนที่ ในขณะที่. โดยละเว้นรายการคำใน for คำสั่ง ใช้พารามิเตอร์ตำแหน่งแทน ภายในลูป อินสแตนซ์ก่อนหน้าของตัวแปร i ได้เปลี่ยนเป็นตัวแปร j. การใช้งานของ เปลี่ยน ถูกกำจัดออกไปด้วย
ทำไมฉัน?
คุณอาจสังเกตเห็นว่าตัวแปร i ได้รับเลือกให้แต่ละ for ตัวอย่างลูปด้านบน ทำไม? ไม่มีเหตุผลเฉพาะเจาะจงจริงๆ นอกจากประเพณี ตัวแปรที่ใช้กับ for สามารถเป็นตัวแปรใดๆ ก็ได้ แต่ i เป็นส่วนใหญ่ รองลงมาคือ j และ k.
พื้นฐานของประเพณีนี้มาจากภาษาโปรแกรม Fortran ใน Fortran ตัวแปรที่ไม่ได้ประกาศที่ขึ้นต้นด้วยตัวอักษร I, J, K, L และ M จะถูกพิมพ์โดยอัตโนมัติเป็นจำนวนเต็ม ในขณะที่ตัวแปรที่ขึ้นต้นด้วยตัวอักษรอื่น ๆ จะถูกพิมพ์เป็นจำนวนจริง (ตัวเลขที่มีเศษส่วนทศนิยม) พฤติกรรมนี้ทำให้โปรแกรมเมอร์ใช้ตัวแปร I, J และ K สำหรับตัวแปรลูป เนื่องจากใช้งานน้อยกว่าเมื่อต้องการตัวแปรชั่วคราว (ซึ่งมักเป็นตัวแปรลูป)
นอกจากนี้ยังนำไปสู่การใช้ไหวพริบตาม Fortran ต่อไปนี้: “พระเจ้ามีจริง เว้นแต่จะประกาศเป็นจำนวนเต็ม”