FOR loops & WHILE statements

Bash Scripting เบื้องต้น

Alex Scriven

Data Scientist

โครงสร้าง FOR Loop พื้นฐาน

Python:

for x in range(3):
    print(x)
0
1
2

R:

for (x in seq(3)){
    print(x)
}
[1] 1
[1] 2
[1] 3
Bash Scripting เบื้องต้น

FOR Loop ใน Bash

โครงสร้างพื้นฐานใน Bash มีลักษณะคล้ายกัน:

for x in 1 2 3

do echo $x done
1
2
3
Bash Scripting เบื้องต้น

ช่วงตัวเลขใน FOR loop

Bash มีวิธีสร้างช่วงตัวเลขที่เรียกว่า "brace expansion":

  • {START..STOP..INCREMENT}
for x in {1..5..2}

do echo $x done
1
3
5
Bash Scripting เบื้องต้น

FOR loop แบบ three expression syntax

อีกรูปแบบที่นิยมใช้คือ "three expression" syntax

  • ใส่นิพจน์สามส่วนในวงเล็บคู่
  • ส่วนแรกคือค่าเริ่มต้น (x=2)
  • ส่วนกลางคือเงื่อนไขสิ้นสุด (x<=4)
  • ส่วนท้ายคือนิพจน์เพิ่ม (หรือลด) ค่า (x+=2)

 

 

for ((x=2;x<=4;x+=2))
do 
    echo $x
done
2
4
Bash Scripting เบื้องต้น

Glob expansions

Bash รองรับการขยายรูปแบบ (pattern-matching) ใน for loop ด้วยสัญลักษณ์ * เช่น ไฟล์ในไดเรกทอรี

ตัวอย่างเช่น สมมติว่ามีเอกสารข้อความสองไฟล์ในโฟลเดอร์ /books:

for book in books/*
do  
    echo $book
done
books/book1.txt
books/book2.txt
Bash Scripting เบื้องต้น

Shell-within-a-shell ทบทวนอีกครั้ง

จำการสร้าง shell-within-a-shell ด้วย $() ได้ไหม?

สามารถเรียกใช้ใน for loop ได้เลย!

สมมติว่าโครงสร้างโฟลเดอร์เป็นดังนี้:

โครงสร้างไดเรกทอรี books

Bash Scripting เบื้องต้น

Shell-within-a-shell สู่ FOR loop

สามารถวนลูปผ่านผลลัพธ์ของ shell-within-a-shell ได้:

for book in $(ls books/ | grep -i 'air')

do echo $book done
AirportBook.txt
FairMarketBook.txt
Bash Scripting เบื้องต้น

ไวยากรณ์ WHILE statement

คล้ายกับ FOR loop แต่กำหนดเงื่อนไขที่ตรวจสอบในทุกรอบ

วนซ้ำต่อไปจนกว่าเงื่อนไขไม่เป็นจริง!

  • ใช้คำว่า while แทน for
  • ใส่เงื่อนไขในวงเล็บเหลี่ยม
    • ใช้ flag เปรียบเทียบตัวเลขแบบเดียวกับ IF (เช่น -le)
  • เชื่อมหลายเงื่อนไขด้วยวงเล็บคู่และ && (AND) หรือ || (OR) เหมือน IF
  • ต้องมีการเปลี่ยนแปลงภายในลูปเพื่อให้หยุดได้ (มิฉะนั้นอาจเกิด infinite loop!)
Bash Scripting เบื้องต้น

ตัวอย่าง WHILE statement

ตัวอย่างง่าย ๆ:

x=1

while [ $x -le 3 ];
do echo $x ((x+=1)) done
1
2
3
Bash Scripting เบื้องต้น

ระวัง infinite loop

ระวัง infinite loop หากเงื่อนไขหยุดไม่เคยเป็นจริง

x=1
while [ $x -le 3 ]; 
do
    echo $x
    # don't increment x. It never reaches 3!
    # ((x+=1)) 
done

โค้ดนี้จะพิมพ์ 1 ออกมาตลอดไป!

Bash Scripting เบื้องต้น

มาฝึกกันเถอะ!

Bash Scripting เบื้องต้น

Preparing Video For Download...