คำสั่ง CASE

Bash Scripting เบื้องต้น

Alex Scriven

Data Scientist

ทำไมต้องใช้คำสั่ง CASE

คำสั่ง CASE เหมาะกว่า IF เมื่อมีเงื่อนไขหลายข้อหรือซับซ้อน

สมมติต้องการตรวจสอบเงื่อนไขต่อไปนี้:

  • ถ้าไฟล์มีคำว่า sydney ให้ย้ายไปที่ไดเรกทอรี /sydney
  • ถ้าไฟล์มีคำว่า melbourne หรือ brisbane ให้ลบไฟล์นั้น
  • ถ้าไฟล์มีคำว่า canberra ให้เปลี่ยนชื่อเป็น IMPORTANT_filename โดยที่ filename คือชื่อเดิม
Bash Scripting เบื้องต้น

คำสั่ง IF ที่ซับซ้อน

สามารถเขียนหลายคำสั่ง IF ได้ดังนี้:

  • โค้ดนี้เรียก grep กับอาร์กิวเมนต์ ARGV แรกในเงื่อนไข
if grep -q 'sydney' $1; then
    mv $1 sydney/
fi
if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi
if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi
  • ดูซับซ้อนและซ้ำซากใช่ไหม?
Bash Scripting เบื้องต้น

สร้างคำสั่ง CASE

  • เริ่มด้วยการเลือกตัวแปรหรือสตริงที่ต้องการจับคู่
    • ใช้ shell-within-a-shell ที่นี่ก็ได้!
  • เพิ่มรูปแบบและการกระทำได้ตามต้องการ
    • ใช้ regex สำหรับ PATTERN ได้ เช่น Air* สำหรับ 'ขึ้นต้นด้วย Air' หรือ *hat* สำหรับ 'มีคำว่า hat'
  • คั่นระหว่าง pattern กับโค้ดที่จะรันด้วยวงเล็บปิด และจบคำสั่งด้วย double semi-colon

รูปแบบพื้นฐานของคำสั่ง CASE:

case 'STRINGVAR' in

PATTERN1) COMMAND1;; PATTERN2) COMMAND2;;
Bash Scripting เบื้องต้น

สร้างคำสั่ง CASE

 

  • *) DEFAULT COMMAND;;

    • นิยม (แต่ไม่บังคับ) ปิดท้ายด้วยคำสั่ง default ที่รันเมื่อไม่มี pattern ใดตรง
  • esac คำสั่งปิดท้ายคือ 'esac'

    • นี่คือคำว่า 'case' สะกดกลับหลัง!

รูปแบบพื้นฐานของคำสั่ง CASE:

case 'STRING' in
  PATTERN1)
  COMMAND1;;
  PATTERN2)
  COMMAND2;;

*) DEFAULT COMMAND;;
esac
Bash Scripting เบื้องต้น

จาก IF สู่ CASE

คำสั่ง IF เดิม:

if grep -q 'sydney' $1; then
    mv $1 sydney/
fi

if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi

if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi

คำสั่ง CASE ใหม่:

case $(cat $1) in

*sydney*) mv $1 sydney/ ;; *melbourne*|*brisbane*) rm $1 ;; *canberra*) mv $1 "IMPORTANT_$1" ;;
*) echo "No cities found" ;; esac
Bash Scripting เบื้องต้น

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

Bash Scripting เบื้องต้น

Preparing Video For Download...