Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

คำสั่งควบคู่กับตัวดำเนินการควบคุมใน Bash

คำสั่งผสมอย่างง่าย—เช่นการร้อยคำสั่งหลายคำสั่งเข้าด้วยกันเป็นลำดับบนบรรทัดคำสั่ง—มักใช้ คำสั่งดังกล่าวคั่นด้วยเครื่องหมายอัฒภาค ซึ่งกำหนดจุดสิ้นสุดของคำสั่ง ในการสร้างชุดคำสั่งเชลล์อย่างง่ายในบรรทัดเดียว เพียงแยกแต่ละคำสั่งโดยใช้เครื่องหมายอัฒภาค ดังนี้:

command1 ; command2 ; command3 ; command4 ;  

คุณไม่จำเป็นต้องเพิ่มอัฒภาคสุดท้ายเนื่องจากการกดแป้น Enter หมายถึงการสิ้นสุดคำสั่งสุดท้าย แต่คุณสามารถเพิ่มเพื่อความสอดคล้องได้

คำสั่งทั้งหมดจะทำงานโดยไม่มีปัญหา ตราบใดที่ไม่มีข้อผิดพลาดเกิดขึ้น แต่จะเกิดอะไรขึ้นถ้าเกิดข้อผิดพลาดขึ้น? เราสามารถคาดการณ์และอนุญาตให้มีข้อผิดพลาดโดยใช้ && และ || ตัวดำเนินการควบคุมที่สร้างขึ้นใน Bash ตัวดำเนินการควบคุมทั้งสองนี้มีการควบคุมโฟลว์บางอย่าง และทำให้เราสามารถปรับเปลี่ยนลำดับการเรียกใช้โค้ดได้ อัฒภาคและ ขึ้นบรรทัดใหม่ อักขระยังถือเป็นตัวดำเนินการควบคุม Bash ด้วย

&& โอเปอเรเตอร์บอกว่า "ถ้า command1 สำเร็จ ให้รัน command2" หาก command1 ล้มเหลวด้วยเหตุผลใดก็ตาม command2 จะไม่ทำงาน ไวยากรณ์นั้นดูเหมือนว่า:

command1 && command2 

ใช้งานได้เพราะทุกคำสั่งส่งคืนรหัสไปยังเชลล์ที่ระบุว่าสำเร็จหรือล้มเหลวระหว่างการดำเนินการ ตามแบบแผน รหัสส่งคืน (RC) ที่เป็น 0 (ศูนย์) บ่งชี้ความสำเร็จ และจำนวนบวกใดๆ บ่งชี้ถึงความล้มเหลวบางประเภท เครื่องมือดูแลระบบบางตัวจะคืนค่า 1 เพื่อบ่งชี้ความล้มเหลว แต่หลายเครื่องมือใช้รหัสตัวเลขที่เป็นบวกเพื่อระบุประเภทของความล้มเหลว

$? . ของ Bash shell สามารถตรวจสอบตัวแปรได้ง่ายมากโดยสคริปต์ โดยคำสั่งถัดไปในรายการคำสั่ง หรือแม้แต่โดยผู้ดูแลระบบโดยตรง มาดู RC กัน เราสามารถเรียกใช้คำสั่งง่ายๆ และตรวจสอบ RC ได้ทันที ซึ่งจะเกี่ยวข้องกับคำสั่งสุดท้ายที่รันเสมอ

[student@studentvm1 ~]$ ll; echo "RC =$?"
total 284
-rw-rw-r--  1 student student   130 Sep 15 16:21 ascii-program.sh
drwxrwxr-x  2 student student  4096 10 พ.ย. 11:09 น.

drwxr-xr-x. นักเรียน 2 คน  4096 18 ส.ค. 10:21 วิดีโอ
RC =0
[student@studentvm1 ~]$

RC นี้คือ 0 ซึ่งหมายความว่าคำสั่งเสร็จสมบูรณ์ ลองใช้คำสั่งเดียวกันบนไดเร็กทอรีที่เราไม่ได้รับอนุญาต

[student@studentvm1 ~]$ ll /root; echo "RC =$?"
ls:ไม่สามารถเปิดไดเร็กทอรี '/root':ปฏิเสธการอนุญาต
RC =2
[student@studentvm1 ~]$

ความหมายของ RC นี้สามารถพบได้ใน ls หน้าคนของคำสั่ง

มาลอง && . กัน ตัวดำเนินการควบคุมตามที่อาจจะใช้ในโปรแกรมบรรทัดคำสั่ง เราจะเริ่มต้นด้วยสิ่งง่ายๆ:สร้างไดเร็กทอรีใหม่และหากสำเร็จ ให้สร้างไฟล์ใหม่ในนั้น

เราต้องการไดเร็กทอรีที่เราสามารถสร้างไดเร็กทอรีอื่นได้ ขั้นแรก สร้างไดเร็กทอรีชั่วคราวในโฮมไดเร็กตอรี่ของคุณซึ่งคุณสามารถทำการทดสอบได้

[student@studentvm1 ~]$ cd ; mkdir testdir 

สร้างไดเรกทอรีใหม่ใน ~/testdir ซึ่งควรจะว่างเปล่าเพราะคุณเพิ่งสร้างมันขึ้นมา แล้วสร้างไฟล์ใหม่ที่ว่างเปล่าในไดเร็กทอรีใหม่นั้น คำสั่งต่อไปนี้จะทำงานเหล่านั้น

[student@studentvm1 ~]$ mkdir ~/testdir/testdir2 &&touch ~/testdir/testdir2/testfile1 
[student@studentvm1 ~]$ ll ~/testdir/testdir2/
ผลรวม 0
-rw-rw-r-- นักเรียน 1 คน 0 พ.ย. 12 14:13 testfile1
[student@studentvm1 ~]$

เรารู้ว่าทุกอย่างทำงานได้ตามที่ควรจะเป็นเพราะ testdir ไดเร็กทอรีสามารถเข้าถึงได้และเขียนได้ เปลี่ยนการอนุญาตใน testdir ผู้ใช้จึงไม่สามารถเข้าถึง นักเรียน . ได้อีกต่อไป ดังนี้

<ก่อนหน้า>[student@studentvm1 ~]$ chmod 076 testdir; จะ | grep testdir
d---rwxrw-. นักศึกษา 3 คน  4096 12 พ.ย. 14:13 testdir
[student@studentvm1 ~]$

การใช้ grep คำสั่งหลังจากรายการยาว (จะ ) แสดงรายการสำหรับ testdir . จะเห็นได้ว่าผู้ใช้ นักศึกษา ไม่มีสิทธิ์เข้าถึง testdir . อีกต่อไป ไดเรกทอรี ตอนนี้ ให้เรียกใช้คำสั่งเกือบเหมือนเดิม แต่ให้เปลี่ยนเป็นชื่อไดเรกทอรีอื่นภายใน testdir .

[student@studentvm1 ~]$ mkdir ~/testdir/testdir3 &&touch ~/testdir/testdir3/testfile1 
mkdir:cannot create directory '/home/student/testdir/testdir3':Permission denied
[student@studentvm1 ~]$

แม้ว่าเราจะได้รับข้อความแสดงข้อผิดพลาด โดยใช้ && ตัวดำเนินการควบคุมป้องกันไม่ให้สัมผัส คำสั่งไม่ให้รันเนื่องจากมีข้อผิดพลาดในการสร้าง testdir3 . การควบคุมโฟลว์ลอจิคัลบรรทัดคำสั่งประเภทนี้สามารถป้องกันข้อผิดพลาดจากการทบต้นและทำให้สิ่งต่างๆ ยุ่งเหยิงได้ แต่มาทำให้มันซับซ้อนกว่านี้หน่อยเถอะ

|| ตัวดำเนินการควบคุมช่วยให้เราสามารถเพิ่มคำสั่งอื่นที่ดำเนินการเมื่อคำสั่งโปรแกรมเริ่มต้นส่งคืนรหัสที่มากกว่าศูนย์

[student@studentvm1 ~]$ mkdir ~/testdir/testdir3 &&touch ~/testdir/testdir3/testfile1 || echo "เกิดข้อผิดพลาดขณะสร้างไดเรกทอรี" 
mkdir:ไม่สามารถสร้างไดเรกทอรี '/home/student/testdir/testdir3':ปฏิเสธการอนุญาต
เกิดข้อผิดพลาดขณะสร้างไดเรกทอรี
[ student@studentvm1 ~]$

ไวยากรณ์คำสั่งผสมของเราโดยใช้การควบคุมโฟลว์ใช้รูปแบบทั่วไปนี้เมื่อเราใช้ && และ || ตัวดำเนินการควบคุม:

preceding commands ; command1 && command2 || command3 ; following commands 

คำสั่งผสมที่ใช้ตัวดำเนินการควบคุมอาจนำหน้าและตามด้วยคำสั่งอื่นๆ ที่เกี่ยวข้องกับคำสั่งในส่วนควบคุมการไหล แต่ไม่ได้รับผลกระทบจากการควบคุมการไหล คำสั่งเหล่านั้นทั้งหมดจะทำงานโดยไม่คำนึงถึงสิ่งที่เกิดขึ้นภายในคำสั่งผสมควบคุมการไหล

ตัวดำเนินการควบคุมการไหลเหล่านี้สามารถทำให้การทำงานที่บรรทัดคำสั่งมีประสิทธิภาพมากขึ้นด้วยการจัดการการตัดสินใจและแจ้งให้เราทราบเมื่อเกิดปัญหาขึ้น ฉันใช้โดยตรงบนบรรทัดคำสั่งและในสคริปต์

คุณสามารถล้างข้อมูลในฐานะผู้ใช้รูทเพื่อลบไดเร็กทอรีและเนื้อหาในไดเร็กทอรี

[root@studentvm1 ~]# rm -rf /home/student/testdir 

คุณใช้ตัวดำเนินการควบคุม Bash อย่างไร แจ้งให้เราทราบในส่วนความคิดเห็น