เชลล์เป็นตัวแปลคำสั่งสำหรับระบบปฏิบัติการ Bash เป็นเชลล์ที่ฉันโปรดปราน แต่ทุกเชลล์ Linux ตีความคำสั่งที่พิมพ์โดยผู้ใช้หรือผู้ดูแลระบบให้อยู่ในรูปแบบที่ระบบปฏิบัติการสามารถใช้ได้ เมื่อผลลัพธ์ถูกส่งกลับไปยังโปรแกรมเชลล์ ผลลัพธ์จะส่งไปที่ STDOUT ซึ่งโดยค่าเริ่มต้น จะแสดงผลลัพธ์เหล่านั้นในเทอร์มินัล เชลล์ทั้งหมดที่ฉันคุ้นเคยเป็นภาษาโปรแกรมด้วย
คุณลักษณะต่างๆ เช่น การทำให้แท็บสมบูรณ์ การเรียกคืนและการแก้ไขบรรทัดคำสั่ง และทางลัดต่างๆ เช่น นามแฝง ล้วนมีส่วนทำให้คุณค่าของมันในฐานะเชลล์ที่ทรงพลัง โหมดแก้ไขบรรทัดคำสั่งเริ่มต้นใช้ Emacs แต่หนึ่งในคุณสมบัติ Bash ที่ฉันโปรดปรานคือฉันสามารถเปลี่ยนเป็นโหมด Vi เพื่อใช้คำสั่งแก้ไขที่เป็นส่วนหนึ่งของหน่วยความจำกล้ามเนื้อของฉันอยู่แล้ว
อย่างไรก็ตาม หากคุณคิดว่า Bash เป็นเชลล์เพียงอย่างเดียว คุณจะพลาดพลังที่แท้จริงของมันไปมาก ขณะค้นคว้าหลักสูตรการเรียนรู้ด้วยตนเองของ Linux แบบสามเล่ม (ซึ่งมีเนื้อหาเป็นบทความชุดนี้) ฉันได้เรียนรู้สิ่งต่างๆ เกี่ยวกับ Bash ที่ฉันไม่เคยรู้จักมาก่อนในการทำงานกับ Linux มากว่า 20 ปี ความรู้ใหม่เหล่านี้บางส่วนเกี่ยวข้องกับการใช้เป็นภาษาโปรแกรม Bash เป็นภาษาการเขียนโปรแกรมที่ทรงพลัง ซึ่งออกแบบมาอย่างสมบูรณ์แบบสำหรับใช้กับบรรทัดคำสั่งและในเชลล์สคริปต์
ซีรีส์สามส่วนนี้สำรวจโดยใช้ Bash เป็นภาษาการเขียนโปรแกรมอินเทอร์เฟซบรรทัดคำสั่ง (CLI) บทความแรกนี้จะกล่าวถึงการเขียนโปรแกรมบรรทัดคำสั่งง่ายๆ ด้วย Bash ตัวแปร และตัวดำเนินการควบคุม บทความอื่นๆ สำรวจประเภทไฟล์ Bash ตัวดำเนินการเชิงตรรกะแบบสตริง ตัวเลข และแบบเบ็ดเตล็ดที่ให้ตรรกะการควบคุมการดำเนินการ-โฟลว์ การขยายเชลล์ประเภทต่างๆ และ สำหรับ , ในขณะที่ และ จนถึง ลูปที่เปิดใช้งานการดำเนินการซ้ำ ๆ พวกเขายังจะดูคำสั่งบางอย่างที่ลดความซับซ้อนและสนับสนุนการใช้เครื่องมือเหล่านี้ด้วย
เปลือก
เชลล์เป็นตัวแปลคำสั่งสำหรับระบบปฏิบัติการ Bash เป็นเชลล์ที่ฉันโปรดปราน แต่ทุกเชลล์ Linux ตีความคำสั่งที่พิมพ์โดยผู้ใช้หรือผู้ดูแลระบบให้อยู่ในรูปแบบที่ระบบปฏิบัติการสามารถใช้ได้ เมื่อผลลัพธ์ถูกส่งกลับไปยังโปรแกรมเชลล์ ผลลัพธ์จะแสดงในเทอร์มินัล เชลล์ทั้งหมดที่ฉันคุ้นเคยเป็นภาษาโปรแกรมด้วย
Bash ย่อมาจาก Bourne Again Shell เนื่องจาก Bash shell นั้นมีพื้นฐานมาจาก Bourne shell รุ่นเก่าที่เขียนโดย Steven Bourne ในปี 1977 มี Shell อื่นๆ มากมายให้เลือก แต่นี่คือสี่เชลล์ที่ฉันพบบ่อยที่สุด:
- csh: เปลือก C สำหรับโปรแกรมเมอร์ที่ชอบไวยากรณ์ของภาษา C
- ksh: Korn shell เขียนโดย David Korn และเป็นที่นิยมของผู้ใช้ Unix
- tcsh: เวอร์ชันของ csh ที่มีคุณสมบัติใช้งานง่ายขึ้น
- zsh: เปลือก Z ซึ่งรวมคุณสมบัติมากมายของเปลือกยอดนิยมอื่นๆ
เชลล์ทั้งหมดมีคำสั่งในตัวที่เสริมหรือแทนที่คำสั่งที่จัดเตรียมโดยยูทิลิตี้หลัก เปิด man page ของเชลล์และค้นหาส่วน "BUILT-INS" เพื่อดูคำสั่งที่มีให้
แต่ละเชลล์มีบุคลิกและไวยากรณ์ของตัวเอง บางคนจะทำงานได้ดีสำหรับคุณมากกว่าคนอื่น ฉันได้ใช้เปลือก C, เปลือก Korn และเปลือก Z ฉันยังชอบ Bash shell มากกว่าตัวใดตัวหนึ่ง ใช้อันที่เหมาะกับคุณที่สุด แม้ว่าคุณอาจต้องลองใช้ตัวอื่นบ้าง โชคดีที่เปลี่ยนเปลือกหอยได้ง่ายมาก
เชลล์ทั้งหมดเหล่านี้เป็นภาษาโปรแกรม เช่นเดียวกับตัวแปลคำสั่ง ต่อไปนี้คือบทแนะนำสั้นๆ เกี่ยวกับโครงสร้างการเขียนโปรแกรมและเครื่องมือบางส่วนที่เป็นส่วนสำคัญของ Bash
ทุบตีเป็นภาษาโปรแกรม
ผู้ดูแลระบบส่วนใหญ่ใช้ Bash เพื่อออกคำสั่งที่มักจะค่อนข้างง่ายและตรงไปตรงมา แต่ Bash สามารถทำได้มากกว่าการป้อนคำสั่งเดียว และผู้ดูแลระบบจำนวนมากสร้างโปรแกรมบรรทัดคำสั่งอย่างง่ายเพื่อดำเนินการชุดของงาน โปรแกรมเหล่านี้เป็นเครื่องมือทั่วไปที่ช่วยประหยัดเวลาและความพยายาม
วัตถุประสงค์ของฉันเมื่อเขียนโปรแกรม CLI คือการประหยัดเวลาและความพยายาม (เช่น เป็นผู้ดูแลระบบที่ขี้เกียจ) โปรแกรม CLI รองรับสิ่งนี้โดยแสดงรายการคำสั่งหลายคำสั่งในลำดับเฉพาะที่ดำเนินการทีละรายการ ดังนั้นคุณไม่จำเป็นต้องดูความคืบหน้าของคำสั่งใดคำสั่งหนึ่งและพิมพ์คำสั่งถัดไปเมื่อคำสั่งแรกเสร็จสิ้น ไปทำอย่างอื่นได้เลยไม่ต้องคอยติดตามความคืบหน้าของแต่ละคำสั่ง
"โปรแกรม" คืออะไร
Free Online Dictionary of Computing (FOLDOC) ให้คำจำกัดความโปรแกรมดังนี้:"คำสั่งที่ดำเนินการโดยคอมพิวเตอร์ ซึ่งต่างจากอุปกรณ์จริงที่ใช้ทำงาน" WordNet ของมหาวิทยาลัยพรินซ์ตันกำหนดโปรแกรมเป็น:"…ลำดับคำสั่งที่คอมพิวเตอร์สามารถตีความและดำเนินการได้…" วิกิพีเดียยังมีรายการที่ดีเกี่ยวกับโปรแกรมคอมพิวเตอร์
ดังนั้น โปรแกรมสามารถประกอบด้วยคำสั่งอย่างน้อยหนึ่งคำสั่งที่ทำงานเฉพาะที่เกี่ยวข้อง คำสั่งโปรแกรมคอมพิวเตอร์เรียกอีกอย่างว่าคำสั่งโปรแกรม สำหรับผู้ดูแลระบบ โปรแกรมมักจะเป็นลำดับของคำสั่งเชลล์ เชลล์ทั้งหมดที่มีให้สำหรับ Linux อย่างน้อยแบบที่ฉันคุ้นเคย อย่างน้อยก็มีรูปแบบพื้นฐานของความสามารถในการเขียนโปรแกรม และ Bash ซึ่งเป็นเชลล์เริ่มต้นสำหรับลีนุกซ์ส่วนใหญ่ก็ไม่มีข้อยกเว้น
แม้ว่าซีรีส์นี้ใช้ Bash (เพราะแพร่หลายมาก) หากคุณใช้เชลล์อื่น แนวคิดการเขียนโปรแกรมทั่วไปจะเหมือนกัน แม้ว่าโครงสร้างและไวยากรณ์อาจแตกต่างกันบ้าง เชลล์บางตัวอาจรองรับคุณสมบัติบางอย่างที่ตัวอื่นไม่รองรับ แต่ทั้งหมดนั้นมีความสามารถด้านการเขียนโปรแกรมบางอย่าง โปรแกรมเชลล์สามารถเก็บไว้ในไฟล์เพื่อใช้งานซ้ำได้ หรืออาจสร้างบนบรรทัดคำสั่งได้ตามต้องการ
โปรแกรม CLI อย่างง่าย
โปรแกรมบรรทัดคำสั่งที่ง่ายที่สุดคือคำสั่งโปรแกรมหนึ่งหรือสองคำสั่งต่อเนื่องกัน ซึ่งอาจเกี่ยวข้องหรือไม่ ซึ่งป้อนในบรรทัดคำสั่งก่อน Enter กดปุ่ม คำสั่งที่สองในโปรแกรม หากมี อาจขึ้นอยู่กับการกระทำของคำสั่งแรก แต่ไม่จำเป็นต้องเป็นเช่นนั้น
นอกจากนี้ยังมีเครื่องหมายวรรคตอนวากยสัมพันธ์เล็กน้อยที่ต้องระบุให้ชัดเจน เมื่อป้อนคำสั่งเดียวบนบรรทัดคำสั่ง ให้กด Enter คีย์ยุติคำสั่งด้วยเครื่องหมายอัฒภาคโดยนัย (; ). เมื่อใช้ในโปรแกรมเชลล์ CLI ที่ป้อนเป็นบรรทัดเดียวในบรรทัดคำสั่ง ต้องใช้อัฒภาคเพื่อยุติแต่ละคำสั่งและแยกออกจากคำสั่งถัดไป คำสั่งสุดท้ายในโปรแกรมเชลล์ CLI สามารถใช้เซมิโคลอนที่ชัดเจนหรือโดยปริยายได้
ไวยากรณ์พื้นฐานบางส่วน
ตัวอย่างต่อไปนี้จะอธิบายไวยากรณ์นี้ให้กระจ่าง โปรแกรมนี้ประกอบด้วยคำสั่งเดียวที่มีตัวสิ้นสุดที่ชัดเจน:
[student@studentvm1 ~]$ echo "Hello world." ;
Hello world.
นั่นอาจดูเหมือนไม่ใช่โปรแกรมมากนัก แต่เป็นโปรแกรมแรกที่ฉันพบกับภาษาการเขียนโปรแกรมใหม่ทุกภาษาที่ฉันเรียนรู้ ไวยากรณ์อาจแตกต่างกันเล็กน้อยสำหรับแต่ละภาษา แต่ผลลัพธ์จะเหมือนกัน
มาขยายความกันเล็กน้อยเกี่ยวกับโปรแกรมเล็กๆ น้อยๆ แต่แพร่หลายนี้ ผลลัพธ์ของคุณจะแตกต่างจากของฉันเพราะฉันได้ทำการทดลองอื่นๆ แล้ว ในขณะที่คุณอาจมีเพียงไดเร็กทอรีและไฟล์เริ่มต้นที่สร้างขึ้นในไดเรกทอรีหลักของบัญชีในครั้งแรกที่คุณลงชื่อเข้าใช้บัญชีผ่านเดสก์ท็อป GUI
[student@studentvm1 ~]$ echo "My home directory." ; ls ;
My home directory.
chapter25 TestFile1.Linux dmesg2.txt Downloads newfile.txt softlink1 testdir6
chapter26 TestFile1.mac dmesg3.txt file005 Pictures Templates testdir
TestFile1 Desktop dmesg.txt link3 Public testdir Videos
TestFile1.dos dmesg1.txt Documents Music random.txt testdir1
นั่นทำให้รู้สึกดีขึ้นเล็กน้อย ผลลัพธ์มีความเกี่ยวข้องกัน แต่คำสั่งของโปรแกรมแต่ละรายการนั้นไม่ขึ้นอยู่กับกันและกัน สังเกตว่าฉันชอบใส่ช่องว่างก่อนและหลังเครื่องหมายอัฒภาคเพราะมันทำให้โค้ดอ่านง่ายขึ้นเล็กน้อย ลองใช้โปรแกรม CLI เล็กๆ อีกครั้งโดยไม่มีเครื่องหมายอัฒภาคที่ชัดเจนในตอนท้าย:
[student@studentvm1 ~]$ echo "My home directory." ; ls
ไม่มีความแตกต่างในผลลัพธ์
บางอย่างเกี่ยวกับตัวแปร
เช่นเดียวกับภาษาการเขียนโปรแกรมทั้งหมด Bash shell สามารถจัดการกับตัวแปรได้ ตัวแปรคือชื่อเชิงสัญลักษณ์ที่อ้างถึงตำแหน่งเฉพาะในหน่วยความจำที่มีค่าบางประเภท ค่าของตัวแปรเปลี่ยนแปลงได้ กล่าวคือ เป็นตัวแปร
Bash ไม่ได้พิมพ์ตัวแปรเช่น C และภาษาที่เกี่ยวข้อง โดยกำหนดให้เป็นจำนวนเต็ม จุดลอยตัว หรือประเภทสตริง ใน Bash ตัวแปรทั้งหมดเป็นสตริง สตริงที่เป็นจำนวนเต็มสามารถใช้ในเลขคณิตจำนวนเต็ม ซึ่งเป็นคณิตศาสตร์ประเภทเดียวที่ Bash สามารถทำได้ หากต้องการคณิตศาสตร์ที่ซับซ้อนกว่านี้ bc สามารถใช้คำสั่งในโปรแกรมและสคริปต์ CLI ได้
ตัวแปรเป็นค่าที่กำหนดและสามารถใช้เพื่ออ้างถึงค่าเหล่านั้นในโปรแกรมและสคริปต์ CLI ค่าของตัวแปรถูกกำหนดโดยใช้ชื่อแต่ไม่ได้นำหน้าด้วย $ เข้าสู่ระบบ. การมอบหมาย VAR=10 ตั้งค่าตัวแปร VAR เป็น 10 หากต้องการพิมพ์ค่าของตัวแปร คุณสามารถใช้คำสั่ง echo $VAR . เริ่มต้นด้วยตัวแปรข้อความ (เช่น ไม่ใช่ตัวเลข)
ตัวแปร Bash จะกลายเป็นส่วนหนึ่งของสภาพแวดล้อมของเชลล์จนกว่าจะไม่มีการตั้งค่า
ตรวจสอบค่าเริ่มต้นของตัวแปรที่ยังไม่ได้กำหนด มันควรจะเป็นโมฆะ จากนั้นกำหนดค่าให้กับตัวแปรและพิมพ์เพื่อตรวจสอบค่าของตัวแปร คุณสามารถทำทั้งหมดนี้ได้ในโปรแกรม CLI เดียว:
[student@studentvm1 ~]$ echo $MyVar ; MyVar="Hello World" ; echo $MyVar ;
Hello World
[student@studentvm1 ~]$
หมายเหตุ:ไวยากรณ์ของการกำหนดตัวแปรนั้นเข้มงวดมาก ต้องไม่มีช่องว่างด้านใดด้านหนึ่งของเท่ากับ (= ) ลงชื่อในใบแจ้งการมอบหมายงาน
บรรทัดว่างแสดงว่าค่าเริ่มต้นของ MyVar เป็นโมฆะ การเปลี่ยนและการตั้งค่าของตัวแปรทำได้ในลักษณะเดียวกัน ตัวอย่างนี้แสดงทั้งค่าเดิมและค่าใหม่
ดังที่ได้กล่าวมาแล้ว Bash สามารถทำการคำนวณเลขคณิตจำนวนเต็มได้ ซึ่งมีประโยชน์สำหรับการคำนวณการอ้างอิงไปยังตำแหน่งขององค์ประกอบในอาร์เรย์หรือการทำโจทย์ทางคณิตศาสตร์อย่างง่าย ไม่เหมาะสำหรับการคำนวณทางวิทยาศาสตร์หรืออะไรก็ได้ที่ต้องใช้ทศนิยม เช่น การคำนวณทางการเงิน มีเครื่องมือที่ดีกว่ามากสำหรับการคำนวณประเภทเหล่านั้น
นี่คือการคำนวณง่ายๆ:
[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1*Var2))"
Result = 63
จะเกิดอะไรขึ้นเมื่อคุณทำการคำนวณทางคณิตศาสตร์ที่ส่งผลให้เกิดจำนวนทศนิยม
[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1/Var2))"
Result = 0
[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var2/Var1))"
Result = 1
[student@studentvm1 ~]$
ผลลัพธ์คือจำนวนเต็มที่ใกล้เคียงที่สุด ขอให้สังเกตว่าการคำนวณได้ดำเนินการเป็นส่วนหนึ่งของ เสียงสะท้อน คำแถลง. การคำนวณจะดำเนินการก่อนคำสั่ง echo ที่ล้อมรอบเนื่องจากลำดับความสำคัญของ Bash สำหรับรายละเอียด โปรดดูที่ Bash man page และค้นหา "precedence"
ตัวดำเนินการควบคุม
ตัวดำเนินการควบคุมเชลล์เป็นหนึ่งในตัวดำเนินการทางวากยสัมพันธ์สำหรับการสร้างโปรแกรมบรรทัดคำสั่งที่น่าสนใจได้อย่างง่ายดาย รูปแบบที่ง่ายที่สุดของโปรแกรม CLI เป็นเพียงการสตริงคำสั่งต่างๆ เข้าด้วยกันเป็นลำดับบนบรรทัดคำสั่ง:
command1 ; command2 ; command3 ; command4 ; . . . ; etc. ;
คำสั่งเหล่านั้นทำงานโดยไม่มีปัญหาตราบใดที่ไม่มีข้อผิดพลาดเกิดขึ้น แต่จะเกิดอะไรขึ้นเมื่อมีข้อผิดพลาดเกิดขึ้น? คุณสามารถคาดการณ์และอนุญาตข้อผิดพลาดโดยใช้ && . ในตัว และ || ตัวดำเนินการควบคุมทุบตี ตัวดำเนินการควบคุมทั้งสองนี้มีการควบคุมโฟลว์บางอย่าง และช่วยให้คุณสามารถเปลี่ยนลำดับของการดำเนินการโค้ดได้ อัฒภาคยังถือเป็นตัวดำเนินการควบคุม Bash เช่นเดียวกับอักขระขึ้นบรรทัดใหม่
&& โอเปอเรเตอร์พูดง่ายๆ ว่า "ถ้า command1 สำเร็จ ให้รัน command2 ถ้า command1 ล้มเหลวด้วยเหตุผลใดก็ตาม command2 จะถูกข้าม" ไวยากรณ์นั้นมีลักษณะดังนี้:
command1 && command2
ตอนนี้ ดูคำสั่งบางอย่างที่จะสร้างไดเร็กทอรีใหม่ และถ้าสำเร็จ ให้ทำให้มันเป็นไดเร็กทอรีการทำงานปัจจุบัน (PWD) ตรวจสอบให้แน่ใจว่าโฮมไดเร็กตอรี่ของคุณ (~ ) คือ กปปส. ลองสิ่งนี้ก่อนใน /root , ไดเร็กทอรีที่คุณไม่สามารถเข้าถึง:
[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir/ && cd $Dir
mkdir: cannot create directory '/root/testdir/': Permission denied
[student@studentvm1 ~]$
ข้อผิดพลาดเกิดจาก mkdir สั่งการ. คุณไม่ได้รับข้อผิดพลาดที่ระบุว่าไม่สามารถสร้างไฟล์ได้เนื่องจากการสร้างไดเร็กทอรีล้มเหลว && ตัวดำเนินการควบคุมตรวจพบรหัสส่งคืนที่ไม่ใช่ศูนย์ ดังนั้น สัมผัส คำสั่งถูกข้าม การใช้ && ตัวดำเนินการควบคุมป้องกันไม่ให้สัมผัส คำสั่งไม่ให้รันเนื่องจากมีข้อผิดพลาดในการสร้างไดเร็กทอรี การควบคุมการไหลของโปรแกรมบรรทัดคำสั่งประเภทนี้สามารถป้องกันข้อผิดพลาดจากการทบต้นและทำให้สิ่งต่างๆ ยุ่งเหยิงได้ แต่ถึงเวลาต้องซับซ้อนกว่านี้แล้ว
|| ตัวดำเนินการควบคุมช่วยให้คุณสามารถเพิ่มคำสั่งโปรแกรมอื่นที่ดำเนินการเมื่อคำสั่งโปรแกรมเริ่มต้นส่งคืนรหัสที่มากกว่าศูนย์ ไวยากรณ์พื้นฐานมีลักษณะดังนี้:
command1 || command2
ไวยากรณ์นี้อ่านว่า "หาก command1 ล้มเหลว ให้ดำเนินการ command2" นั่นก็หมายความว่าถ้า command1 สำเร็จ command2 จะถูกข้าม ลองทำสิ่งนี้โดยพยายามสร้างไดเร็กทอรีใหม่:
[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$
นี่คือสิ่งที่คุณคาดหวัง เนื่องจากไม่สามารถสร้างไดเร็กทอรีใหม่ คำสั่งแรกจึงล้มเหลว ซึ่งส่งผลให้มีการดำเนินการคำสั่งที่สอง
การรวมโอเปอเรเตอร์ทั้งสองนี้เข้าด้วยกันจะทำให้เกิดประโยชน์สูงสุดจากทั้งสองอย่าง ไวยากรณ์ของตัวดำเนินการควบคุมโดยใช้การควบคุมโฟลว์บางอย่างใช้รูปแบบทั่วไปนี้เมื่อ && และ || ใช้ตัวดำเนินการควบคุม:
preceding commands ; command1 && command2 || command3 ; following commands
ไวยากรณ์นี้สามารถระบุได้ดังนี้:"ถ้า command1 ออกโดยมีโค้ดส่งคืนเป็น 0 ให้ดำเนินการ command2 มิฉะนั้นจะรัน command3" ลองเลย:
[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$
ลองใช้คำสั่งสุดท้ายอีกครั้งโดยใช้โฮมไดเร็กทอรีของคุณแทน /root ไดเรกทอรี คุณจะได้รับอนุญาตให้สร้างไดเร็กทอรีนี้:
[student@studentvm1 ~]$ Dir=~/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
[student@studentvm1 testdir]$
ไวยากรณ์ตัวดำเนินการควบคุม เช่น command1 &&command2 ทำงานได้เพราะทุกคำสั่งส่งโค้ดส่งคืน (RC) ไปยังเชลล์เพื่อระบุว่าดำเนินการสำเร็จหรือไม่ หรือเกิดความล้มเหลวบางประเภทระหว่างการดำเนินการ ตามธรรมเนียมแล้ว RC ที่เป็นศูนย์ (0) บ่งชี้ความสำเร็จ และจำนวนบวกใดๆ บ่งชี้ถึงความล้มเหลวบางประเภท เครื่องมือบางอย่างที่ผู้ดูแลระบบใช้เพียงแค่คืนค่าหนึ่ง (1) เพื่อบ่งชี้ความล้มเหลว แต่อีกจำนวนมากใช้รหัสอื่นเพื่อระบุประเภทของความล้มเหลวที่เกิดขึ้น
ตัวแปรเชลล์ทุบตี $? มี RC จากคำสั่งสุดท้าย RC นี้สามารถตรวจสอบได้ง่ายมากด้วยสคริปต์ คำสั่งถัดไปในรายการคำสั่ง หรือแม้แต่ผู้ดูแลระบบโดยตรง เริ่มต้นด้วยการรันคำสั่งง่ายๆ และตรวจสอบ RC ทันที RC จะเป็นคำสั่งสุดท้ายที่รันก่อนที่คุณจะดูมันเสมอ
[student@studentvm1 testdir]$ ll ; echo "RC = $?"
total 1264
drwxrwxr-x 2 student student 4096 Mar 2 08:21 chapter25
drwxrwxr-x 2 student student 4096 Mar 21 15:27 chapter26
-rwxr-xr-x 1 student student 92 Mar 20 15:53 TestFile1
<snip>
drwxrwxr-x. 2 student student 663552 Feb 21 14:12 testdir
drwxr-xr-x. 2 student student 4096 Dec 22 13:15 Videos
RC = 0
[student@studentvm1 testdir]$
RC ในกรณีนี้ เป็นศูนย์ ซึ่งหมายความว่าคำสั่งเสร็จสมบูรณ์ ตอนนี้ให้ลองใช้คำสั่งเดียวกันบนโฮมไดเร็กทอรีของ root ซึ่งเป็นไดเร็กทอรีที่คุณไม่มีสิทธิ์อนุญาตสำหรับ:
[student@studentvm1 testdir]$ ll /root ; echo "RC = $?"
ls: cannot open directory '/root': Permission denied
RC = 2
[student@studentvm1 testdir]$
ในกรณีนี้ RC คือสอง; นี่หมายความว่าการอนุญาตถูกปฏิเสธสำหรับผู้ใช้ที่ไม่ใช่รูทในการเข้าถึงไดเร็กทอรีที่ผู้ใช้ไม่ได้รับอนุญาตให้เข้าถึง ตัวดำเนินการควบคุมใช้ RC เหล่านี้เพื่อให้คุณสามารถเปลี่ยนลำดับการทำงานของโปรแกรมได้
สรุป
บทความนี้มองว่า Bash เป็นภาษาการเขียนโปรแกรมและสำรวจไวยากรณ์พื้นฐานรวมถึงเครื่องมือพื้นฐานบางอย่าง มันแสดงให้เห็นวิธีการพิมพ์ข้อมูลไปยัง STDOUT และวิธีการใช้ตัวแปรและตัวดำเนินการควบคุม บทความถัดไปในชุดนี้จะกล่าวถึงตัวดำเนินการตรรกะของ Bash บางตัวที่ควบคุมการไหลของการดำเนินการคำสั่ง