ในบทนี้ เราจะมาดูกันว่าเราจะใช้คำสั่ง if-then-Else ในสคริปต์สภาพแวดล้อม Bash ที่เราเขียนได้อย่างไร คำสั่ง if-then-Else เป็นเครื่องมือที่มีประโยชน์ในการกำหนดเส้นทางของการดำเนินการของสคริปต์เมื่อตรงตามเงื่อนไขบางประการ ให้เราดูว่าไวยากรณ์สำหรับคำสั่ง if-then-Else คืออะไร:
ถ้าบางคำสั่ง;แล้วแล้ว-คำสั่ง;
อื่นคำสั่งอื่น;
เป็น
ในคำสั่งด้านบนที่แสดง หากพบว่า SOME-COMMANDS เป็นจริงหรือพบว่าสถานะการส่งคืนเป็น 0 คำสั่ง THEN-COMMANDS จะถูกดำเนินการ หากไม่เป็นเช่นนั้น คำสั่ง ELSE-COMMANDS จะถูกดำเนินการ ในคำสั่งบางคำสั่ง เรามักจะทำการเปรียบเทียบสตริงหรือการเปรียบเทียบค่าในรูปของจำนวนเต็ม เรายังดำเนินการหลายอย่างที่เกี่ยวข้องกับไฟล์ได้ ให้เราดูตัวอย่างคำสั่งหลักซึ่งส่วนใหญ่ใช้เมื่อทำงานกับเงื่อนไขแบบไฟล์:
หลัก | ความหมาย |
---|---|
[ -ถึง ] | คืนค่า true เมื่อมี FILE |
[-NS] | คืนค่า true เมื่อ FILE มีอยู่ & เป็นไฟล์บล็อกพิเศษ |
[-ค] | คืนค่า true เมื่อมี FILE อยู่ & เป็นไฟล์อักขระพิเศษ |
[ -NS ] | คืนค่า true เมื่อมี FILE อยู่ & เป็นไดเร็กทอรี |
[ -และ ] | คืนค่า true เมื่อมี FILE |
[ -NS ] | คืนค่า จริง เมื่อ FILE มีอยู่ & เป็นไฟล์ปกติ |
[ -NS ] | คืนค่า true เมื่อมี FILE และตั้งค่าบิต SGID |
[ -ชม ] | คืนค่า true เมื่อมี FILE อยู่ & เป็นลิงก์สัญลักษณ์ |
[-k] | คืนค่า จริง เมื่อมี FILE และตั้งค่าบิตเหนียว |
[ -NS ] | คืนค่า true เมื่อมี FILE อยู่ & เป็นไพพ์ที่มีชื่อ (FIFO) |
[ -NS ] | คืนค่า true เมื่อมี FILE อยู่ & สามารถอ่านได้ |
[ -NS ] | ส่งคืนค่าจริงเมื่อมี FILE และมีขนาดที่มากกว่าศูนย์ |
[ -NS ] | คืนค่า จริง เมื่อ file descriptor FD เปิดอยู่ & หมายถึงเทอร์มินัล |
[-ยู] | ส่งคืนค่าจริงเมื่อมี FILE และบิต SUID (ตั้งค่า ID ผู้ใช้) ถูกตั้งค่า |
[ -ใน ] | คืนค่า true เมื่อมี FILE และเขียนได้ |
[-NS] | คืนค่า true เมื่อมี FILE อยู่ & สามารถเรียกใช้งานได้ |
[-O] | คืนค่า จริง เมื่อ FILE มีอยู่ & เป็นเจ้าของโดย ID ผู้ใช้ที่มีประสิทธิภาพ |
[ -NS ] | คืนค่า จริง เมื่อ FILE มีอยู่ & เป็นเจ้าของโดย ID กลุ่มที่มีผล |
[ -NS ] | คืนค่า true เมื่อมี FILE อยู่ & เป็นลิงก์สัญลักษณ์ |
[ -NS ] | คืนค่า true เมื่อมี FILE อยู่ & ได้รับการแก้ไขตั้งแต่อ่านครั้งล่าสุด |
[ -NS ] | คืนค่า จริง เมื่อ FILE มีอยู่ & เป็นซ็อกเก็ต |
THEN-COMMANDS และ ELSE-COMMANDS สามารถเป็นการดำเนินการ UNIX ที่ถูกต้องหรือโปรแกรมปฏิบัติการใดๆ ก็ได้ โปรดทราบว่า แล้ว และ เป็น คำสั่งจะถูกคั่นด้วยเครื่องหมายเซมิโคลอนเนื่องจากถือเป็นองค์ประกอบที่แยกจากกันโดยสิ้นเชิงของสคริปต์
ตัวอย่างง่ายๆ ถ้า-แล้ว-อื่น
เรามาเริ่มบทเรียนของเราด้วยตัวอย่างง่ายๆ ด้วยประโยค if-then-Else
นี่คือตัวอย่างโปรแกรม:
นี่คือผลลัพธ์ที่เราเห็นเมื่อเราเรียกใช้สคริปต์ของเรา:
$. ifelse1.shมีค่าเท่ากัน!
$
การใช้อาร์กิวเมนต์บรรทัดคำสั่ง
เรายังสามารถใช้อาร์กิวเมนต์บรรทัดคำสั่งในสคริปต์ของเรา และใช้จำนวนอาร์กิวเมนต์และค่าต่างๆ เป็นเงื่อนไขในคำสั่ง IF ที่เรากำหนด ก่อนอื่นเรากำหนดไฟล์ข้อความที่มีเนื้อหาดังต่อไปนี้:
ฉันชื่อ LinuxHint ฉันรักเซิร์ฟเวอร์ โดยเฉพาะเซิร์ฟเวอร์ Ubuntu พวกเขาเป็นเช่นนั้น
สิ้นสุด!
ตอนนี้ เราสามารถเขียนสคริปต์เพื่อค้นหาว่าคำนั้นอยู่ในไฟล์ข้อความหรือไม่ มากำหนดสคริปต์กันตอนนี้:
โยนออก 'หา $1 ใน $2'กริป $ 1 $ 2
ถ้า [ $? -เกิด 0 ]
แล้ว
โยนออก 'ไม่พบ $1 ในไฟล์ $2'
อื่น
โยนออก 'พบ $1 ในไฟล์ $2'
เป็น
โยนออก 'สคริปต์เสร็จสมบูรณ์'
สคริปต์นี้มีไดนามิกมาก โดยจะพิจารณาคำที่จะค้นหาและไฟล์ที่จะค้นหาจากบรรทัดคำสั่งเอง ตอนนี้ เราพร้อมที่จะเรียกใช้สคริปต์ของเราแล้ว:
. ifelse2.sh รัก hello.txtเราจะเห็นผลลัพธ์เช่น:
พบรักในสวัสดี.txtพบรักใน ไฟล์สวัสดี.txt
สคริปเสร็จแล้ว
การตรวจสอบจำนวนอาร์กิวเมนต์บรรทัดคำสั่ง
ภายในคำสั่ง IF เรายังสามารถตรวจสอบจำนวนอาร์กิวเมนต์บรรทัดคำสั่งที่ส่งผ่านไปยังคำสั่งเพื่อให้เราสามารถดำเนินการได้เช่นเดียวกัน:
นับ=$ #ถ้า [ ! $count -gt 1 ]
แล้ว
โยนออก 'มีข้อโต้แย้งไม่เพียงพอ'
อื่น
โยนออก 'ทำได้ดีมาก!'
เป็น
เรียกใช้สคริปต์นี้ตอนนี้ เราจะเห็นผลลัพธ์ต่อไปนี้:
ถ้อยแถลง If-then-Elif-Else
นอกจากนี้เรายังสามารถมีคำสั่ง IF หลายชุดในบล็อกเดียวกันเพื่อจำกัดเส้นทางการตัดสินใจที่โปรแกรมของเราใช้ในการดำเนินการคำสั่งที่เรากำหนดไว้ นี่คือไวยากรณ์เพื่อกำหนดคำสั่ง IF หลายรายการในสคริปต์ของเรา:
ถ้าคำสั่งทดสอบ;แล้ว
ผลลัพธ์-คำสั่ง;
เอลฟ์
คำสั่งอื่น;
แล้ว
คำสั่งผลลัพธ์อื่น;
อื่น
คำสั่งสำรอง;
เป็น
สิ่งนี้ดูค่อนข้างคุ้นเคยและติดตามได้ง่ายเช่นกัน ให้เรากำหนดตัวอย่างง่ายๆ เพื่อสร้างวิธีการทำงานของต้นไม้:
นับ=$ #ถ้า [ $count -eq 1 ]
แล้ว
โยนออก 'พบเพียงข้อโต้แย้งเดียวเท่านั้น'
เอลฟ์ [ $count -eq 2 ]
แล้ว
โยนออก 'ดีกว่าพบสองอาร์กิวเมนต์'
อื่น
โยนออก 'ทำได้ดีมาก พบข้อโต้แย้งมากมาย!'
เป็น
นี่คือสิ่งที่เราได้รับกลับมาด้วยคำสั่งนี้:
การใช้คำสั่งกรณี
คำสั่ง IF-ELSE มีประโยชน์เมื่อคุณมีตัวเลือกมากมายที่คุณต้องตัดสินใจ แต่ในกรณีที่คุณต้องการดำเนินการเฉพาะบางกรณีของการจับคู่แบบตรงทั้งหมดกับผลลัพธ์ เราสามารถใช้คำสั่ง CASE ในสคริปต์ทุบตีได้เช่นกัน ไวยากรณ์ดูเหมือนว่า:
กรณีการแสดงออกในCASE1)คำสั่งเพื่อดำเนินการ;CASE2)คำสั่งเพื่อดำเนินการ;
CASE2)คำสั่งเพื่อดำเนินการ;
...)คำสั่งเพื่อดำเนินการ;
*)คำสั่งเพื่อดำเนินการ;
esac
กรณีสุดท้ายที่มี * ทำหน้าที่เป็นกรณีเริ่มต้นและจะดำเนินการเมื่อไม่พบกรณีที่กำหนดไว้ข้างต้นที่ตรงกัน
ให้เราสร้างตัวอย่างง่ายๆ โดยใช้คำสั่ง CASE:
กรณี '$ 1' ใน1)
โยนออก 'ค่าคือ 1'
;;
2)
โยนออก 'ค่าคือ 2'
;;
3)
โยนออก 'ค่าคือ 3'
;;
*)
โยนออก 'ค่าอื่นผ่านไป'
esac
แต่ละคำสั่งของ CASE สิ้นสุดลงโดย ;; (เครื่องหมายอัฒภาคสองครั้ง). นี่คือสิ่งที่เราได้รับกลับมาด้วยคำสั่งนี้:
บทสรุป
ในบทเรียนนี้ เรามาดูวิธีที่เราสามารถใช้คำสั่ง IF-ELSE, IF-THEN-ELIF และ CASE ในสคริปต์ Bash ที่เรากำหนดเพื่อดำเนินการเฉพาะตามค่าที่มีอยู่ในโปรแกรมของเราหรือส่งผ่านโดยผู้ใช้โดยใช้ตำแหน่ง พารามิเตอร์