เชลล์สคริปต์เบื้องต้น ตอนที่ 6 - เงื่อนไข if

อัดรูปดิจิตอล ทำสมุดภาพของคุณเอง
รอรับได้. ท่องเที่ยว แต่งงาน ฯลฯ

www.tanabutr.co.th/photobook


หลังจากที่เรียนรู้ตัวแปรแล้วก็เข้าเรื่องการใช้เงื่อนไข if. คำสั่งสำหรับสร้างเงื่อนไขมีรูปแบบดังนี้

if command
then
    command
    ...
elif command
then
    command
    ...
else
    command
    ...
fi

command ที่อยู่หลัง if หรือ elif มักจะเป็นคำสั่งสำหรับตรวจสอบเช่นตรวจสอบตัวแปรว่ามีการตั้งค่าหรือไม่, ตรวจสอบไฟล์ว่ามีจริงหรือไม่ เป็นต้น. ส่วน command ที่อยู่หลัง then หรือ else คือคำสั่งเมื่อเงื่อนไขเป็นจริงหรือไม่จริงแล้วแต่กรณี.

คำสั่งที่ใช้ตรวจสอบใช้ร่วมกับ if คือคำสั่ง test. เรามาดูตัวอย่างเลยดีกว่า.

$ if test `whoami` = root
> then
> echo Yes, you are root.
> else
> echo No, your are `whoami`.
> fi
No, you are poonlap.

ให้สังเกตว่าก่อนและหน้าเครื่องหมาย = มีข่องว่างอยู่, หมายความว่าอาร์กิวเมนต์ของคำสั่ง test ในกรณีนี้มีอยู่สามตัวคือ "`whoami`", "=" และ "root". whoami เป็นคำสั่งแสดงชื่อล็อกอินของผู้ใช้ในปัจจุบัน. ดังนั้น `whoami` จะถูกแทนที่ด้วยผลลัพธ์เวลาสั่งคำสั่ง. ส่วน "=" เป็นอาร์กิวเมนต์ของคำสั่ง test ใช้เปรียบเทียบคำที่อยู่ข้างหน้าและหลังว่าเหมือนกันหรือไม่. ถ้าเราลองสั่งคำสั่ง

$ test poonlap = root

จะเห็นว่าไม่มีอะไรเกิดขึ้น. แต่จริงๆแล้วคำสั่ง test ส่งสถานะการจบการทำงานให้เชลล์รับรู้ว่า poonlap = root นั้นเป็นเท็จ. ค่าจบสถานะการทำงานดูได้จากตัวแปรพิเศษ $?. เชลล์ใช้ค่านี้ดูว่าจริงหรือเท็จ. ถ้าเป็น 0 จะหมายถึงคำสั่งจบการทำงานถูกต้อง, เป็นจริง. ถ้าเป็นค่าอื่นๆที่ไม่ใช่ 0 จะหมายถึงจบการทำงานอย่างไม่ถูกต้อง, คือเป็นเท็จ. ดังนั้นถ้า test `whoami` = root เป็นจริงก็จะรันคำสั่งที่อยู่หลัง then ถ้าเป็นเท็จก็จะรันคำสั่งที่อยู่หลัง else. ส่วนคำว่า fi เป็นการบอกเชลล์ว่าจบคำสั่ง if.

คำสั่ง test เวลาใช้กับ if จะดูพิกลไม่เหมือนภาษาคอมพิวเตอร์, เราสามารถเขียนสคริปต์ที่ให้ผลเหมือนกันที่ดูเข้าท่ากว่าได้แบบนี้.

if [ `whoami` = root ]
then
echo Yes, you are root.
else
echo No, your are `whoami`.
fi
No, you are poonlap.

จริงๆแล้ว "[" ก็คือคำสั่ง test แต่เป็นคำสั่งพิเศษคืออาร์กิวเมนต์ตัดสุดท้ายต้องเป็น "]" จะได้ดูเหมือนภาษาคอมพิวเตอร์ทั่วไป. คำสั่ง test สามารถตรวจสอบอะไรได้หลายอย่างเช่น ไฟล์มีตัวตนจริงหรือไม่ (-f), ตัวแปรที่ระบุมีค่าหรือไม่ (-z) ฯลฯ. ให้อ่านรายละเอียดจาก man test เองแล้วกันครับ.