Bash For Loop มี 2 รูปแบบ: 1) ใช้คำสั่ง in กับรายการค่า 2) ไวยากรณ์แบบ C programming
รูปแบบที่ 1: ใช้ in และรายการค่า
for varname in list do command1 command2 ... done
for, in, do, doneเป็นคีย์เวิร์ดlist= รายการค่าคั่นด้วย space (หรือตัวแปรที่เก็บค่าหลายค่า) หากไม่ระบุจะใช้ positional parametersvarname= ตัวแปร Bash ใดๆ
Loop ทำงาน 1 รอบต่อ 1 ค่าใน list ค่าปัจจุบันเก็บไว้ใน varname
รูปแบบที่ 2: ไวยากรณ์แบบ C
for (( expr1; expr2; expr3 )) do command1 command2 ... done
expr1: initialization (รันครั้งแรกก่อน loop)expr2: condition (loop ตราบใดที่ TRUE)expr3: update (รันทุกครั้งหลังจบรอบ)
12 ตัวอย่างการใช้งาน
1. ค่าคงที่หลัง in
$ cat for1.sh i=1 for day in Mon Tue Wed Thu Fri do echo "Weekday $((i++)) : $day" done $ ./for1.sh Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
ระวัง: อย่าใช้คอมมา (Mon, Tue) จะถือเป็นส่วนหนึ่งของค่า
ระวัง: อย่ารับรายการใน double quotes ("Mon Tue Wed") จะถือเป็นค่าเดียว
2. ใช้ตัวแปรเป็นรายการ
$ cat for2.sh i=1 weekdays="Mon Tue Wed Thu Fri" for day in $weekdays do echo "Weekday $((i++)) : $day" done
Best Practice: ปกติควร quote ตัวแปร แต่ ใน for loop ห้าม quote ไม่งั้นจะกลายเป็นค่าเดียว
3. ไม่ระบุลิสต์ ใช้ Positional Parameters
$ cat for3.sh i=1 for day do echo "Weekday $((i++)) : $day" done $ ./for3.sh Mon Tue Wed Thu Fri
ระวัง: อย่าเขียน for day in (มี in แต่ไม่มีค่า) จะไม่เข้าลูปเลย
4. ใช้ Output ของคำสั่ง Unix เป็นลิสต์
$ cat for4.sh
i=1
for username in `awk -F: '{print $1}' /etc/passwd`
do
echo "Username $((i++)) : $username"
done
5. Loop ไฟล์และไดเรกทอรี
$ cat for5.sh i=1 cd ~ for item in * do echo "Item $((i++)) : $item" done
ใช้งาน * คล้าย file globbing ปกติ สามารถใช้ pattern ได้ เช่น /etc/[abcd]*.conf
6. ออกจาก Loop ด้วย break
$ cat for6.sh i=1 for day in Mon Tue Wed Thu Fri do echo "Weekday $((i++)) : $day" if [ $i -eq 3 ]; then break; fi done
7. ข้ามรอบปัจจุบันด้วย continue
$ cat for7.sh
i=1
for day in Mon Tue Wed Thu Fri Sat Sun
do
echo -n "Day $((i++)) : $day"
if [ $i -eq 7 -o $i -eq 8 ]; then
echo " (WEEKEND)"
continue
fi
echo " (weekday)"
done
8. C-style For Loop
$ cat for8.sh for (( i=1; i <= 5; i++ )) do echo "Random number $i: $RANDOM" done
9. Infinite Loop
$ cat for9.sh i=1 for (( ; ; )) do sleep $i echo "Number: $((i++))" done
กด Ctrl+C เพื่อหยุด
10. ใช้ Comma ใน C-style Loop
$ cat for10.sh for ((i=1, j=10; i <= 5; i++, j=j+5)) do echo "Number $i: $j" done
11. Range ด้วย Brace Expansion
$ cat for11.sh
for num in {1..10}
do
echo "Number: $num"
done
12. Range พร้อม Increment
$ cat for12.sh
for num in {1..10..2}
do
echo "Number: $num"
done
# Output: 1, 3, 5, 7, 9
Tip: บุ๊กมาร์กบทความนี้ไว้อ้างอิงครับ!