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

บทนำสู่ระบบอัตโนมัติด้วยสคริปต์ทุบตี

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

  • ข้อดีของระบบอัตโนมัติด้วย Bash shell script
  • เหตุใดการใช้เชลล์สคริปต์จึงเป็นทางเลือกที่ดีกว่าสำหรับผู้ดูแลระบบมากกว่าภาษาที่คอมไพล์เช่น C หรือ C++
  • การสร้างชุดข้อกำหนดสำหรับสคริปต์ใหม่
  • การสร้างสคริปต์เชลล์ Bash อย่างง่ายจากโปรแกรมอินเทอร์เฟซบรรทัดคำสั่ง (CLI)
  • เพิ่มความปลอดภัยโดยใช้ ID ผู้ใช้ (UID) ที่เรียกใช้สคริปต์
  • การใช้เครื่องมือเปรียบเทียบเชิงตรรกะเพื่อให้การควบคุมโฟลว์การดำเนินการสำหรับโปรแกรมและสคริปต์บรรทัดคำสั่ง
  • การใช้ตัวเลือกบรรทัดคำสั่งเพื่อควบคุมการทำงานของสคริปต์
  • การสร้างฟังก์ชัน Bash ที่สามารถเรียกจากตำแหน่งอย่างน้อยหนึ่งตำแหน่งภายในสคริปต์
  • เหตุผลและวิธีการอนุญาตโค้ดของคุณให้เป็นโอเพ่นซอร์ส
  • การสร้างและใช้งานแผนการทดสอบอย่างง่าย

ก่อนหน้านี้ฉันเคยเขียนบทความเกี่ยวกับคำสั่งและไวยากรณ์ของ Bash และการสร้างโปรแกรม Bash ที่บรรทัดคำสั่ง ซึ่งคุณจะพบได้ในส่วนอ้างอิงท้ายบทความนี้ แต่บทความสี่ชุดนี้เป็นเรื่องเกี่ยวกับการสร้างสคริปต์ (และเทคนิคบางอย่างที่ฉันพบว่ามีประโยชน์) มากพอๆ กับที่เกี่ยวกับคำสั่งและไวยากรณ์ของ Bash

เหตุใดฉันจึงใช้เชลล์สคริปต์

ในบทที่ 9 ของ The Linux Philosophy for Sysadmins , ฉันเขียน:

"ผู้ดูแลระบบจะมีประสิทธิภาพมากที่สุดเมื่อคิด — คิดถึงวิธีแก้ปัญหาที่มีอยู่และเกี่ยวกับวิธีการหลีกเลี่ยงปัญหาในอนาคต คิดเกี่ยวกับวิธีการตรวจสอบคอมพิวเตอร์ Linux เพื่อค้นหาเบาะแสที่คาดการณ์และคาดเดาปัญหาในอนาคตเหล่านั้น คิดเกี่ยวกับวิธีการสร้าง [ ของพวกเขา] งานมีประสิทธิภาพมากขึ้น คิดเกี่ยวกับวิธีการทำงานทั้งหมดที่จำเป็นต้องดำเนินการโดยอัตโนมัติไม่ว่าจะเป็นทุกวันหรือปีละครั้ง

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

บทความแรกนี้จะอธิบายว่าเหตุใดเชลล์สคริปต์จึงเป็นเครื่องมือสำคัญสำหรับผู้ดูแลระบบและเป็นพื้นฐานในการสร้างสคริปต์ทุบตีอย่างง่าย

ทำไมต้องเป็นอัตโนมัติ

คุณเคยทำงานที่ยาวและซับซ้อนที่บรรทัดคำสั่งและคิดว่า "ดีใจที่เสร็จแล้ว ตอนนี้ฉันไม่ต้องกังวลกับมันอีกแล้ว!"? ฉันมีบ่อยครั้ง ในที่สุดฉันก็พบว่าเกือบทุกอย่างที่ฉันต้องทำบนคอมพิวเตอร์ (ไม่ว่าจะเป็นของฉันหรือของนายจ้างหรือลูกค้าที่ปรึกษา) จะต้องทำอีกครั้งในอนาคต

แน่นอน ฉันคิดเสมอว่าฉันจะจำวิธีการทำงานของฉันได้ แต่บ่อยครั้งครั้งหน้ายังไกลถึงอนาคตจนลืมไปว่าเคยมีเคย ทำได้แล้ว นับประสา อย่างไร ที่จะทำ ฉันเริ่มเขียนขั้นตอนที่จำเป็นสำหรับงานบางอย่างลงบนเศษกระดาษ แล้วคิดว่า "ฉันโง่จริงๆ!" ฉันก็เลยย้าย scribbles เหล่านั้นไปยังแอปพลิเคชั่น notepad ง่ายๆ บนคอมพิวเตอร์ของฉัน จนกระทั่งวันหนึ่ง ฉันคิดอีกครั้งว่า "ฉันโง่จริงๆ!" หากฉันจะจัดเก็บข้อมูลนี้บนคอมพิวเตอร์ของฉัน ฉันอาจสร้างเชลล์สคริปต์และเก็บไว้ในตำแหน่งมาตรฐาน เช่น /usr/local/bin หรือ ~/bin ดังนั้นฉันจึงสามารถพิมพ์ชื่อโปรแกรมเชลล์และปล่อยให้มันทำงานทั้งหมดที่ฉันเคยทำด้วยตนเอง

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

เชลล์สคริปต์

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

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

สคริปต์ทุบตีหนึ่งสคริปต์สามารถมีคำสั่งใดก็ได้ตั้งแต่คำสั่งสองสามคำสั่งไปจนถึงคำสั่งหลายพันคำสั่ง ฉันได้เขียนสคริปต์ทุบตีด้วยคำสั่งเพียงหนึ่งหรือสองคำสั่ง และฉันได้เขียนสคริปต์ที่มีมากกว่า 2,700 บรรทัด ซึ่งมากกว่าครึ่งหนึ่งเป็นความคิดเห็น

เริ่มต้นใช้งาน

ต่อไปนี้คือตัวอย่างเล็กๆ น้อยๆ ของเชลล์สคริปต์และวิธีสร้าง ในซีรีส์ก่อนหน้าของฉันเกี่ยวกับการเขียนโปรแกรมบรรทัดคำสั่ง Bash ฉันใช้ตัวอย่างจากหนังสือทุกเล่มเกี่ยวกับการเขียนโปรแกรมที่ฉันเคยอ่าน:"สวัสดีชาวโลก" จากบรรทัดคำสั่ง จะมีลักษณะดังนี้:

[student@testvm1 ~]$ echo "Hello world"
Hello world

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

ฉันแนะนำให้ลองตัวอย่างต่อไปนี้ในฐานะผู้ใช้ที่ไม่ใช่รูทบนระบบทดสอบหรือเครื่องเสมือน (VM) แม้ว่าตัวอย่างจะไม่เป็นอันตราย แต่ความผิดพลาดก็เกิดขึ้นได้ และการปลอดภัยก็เป็นเรื่องที่ฉลาดเสมอ

งานแรกคือการสร้างไฟล์เพื่อให้มีโปรแกรมของคุณ ใช้ สัมผัส คำสั่งสร้างไฟล์เปล่า สวัสดี จากนั้นทำให้สามารถเรียกใช้งานได้:

[student@testvm1 ~]$ touch hello
[student@testvm1 ~]$ chmod 774 hello

ตอนนี้ ใช้โปรแกรมแก้ไขที่คุณชื่นชอบเพื่อเพิ่มบรรทัดต่อไปนี้ในไฟล์:

echo "Hello world"

บันทึกไฟล์และเรียกใช้จากบรรทัดคำสั่ง คุณสามารถใช้เชลล์เซสชันแยกต่างหากเพื่อรันสคริปต์ในซีรีส์นี้:

[student@testvm1 ~]$ ./hello 
Hello world!

นี่เป็นโปรแกรม Bash ที่ง่ายที่สุดที่คุณอาจเคยสร้าง—คำสั่งเดียวในไฟล์ สำหรับแบบฝึกหัดนี้ เชลล์สคริปต์ที่สมบูรณ์ของคุณจะสร้างขึ้นโดยใช้คำสั่ง Bash แบบง่ายนี้ ฟังก์ชันของโปรแกรมไม่เกี่ยวข้องกับจุดประสงค์นี้ และคำสั่งง่ายๆ นี้ช่วยให้คุณสร้างโครงสร้างโปรแกรม ซึ่งเป็นเทมเพลตสำหรับโปรแกรมอื่นๆ โดยไม่ต้องกังวลเกี่ยวกับตรรกะของวัตถุประสงค์ในการใช้งาน คุณสามารถมุ่งความสนใจไปที่โครงสร้างพื้นฐานของโปรแกรมและสร้างเทมเพลตของคุณในวิธีที่ง่ายมาก และคุณสามารถสร้างและทดสอบเทมเพลตเองได้ มากกว่าที่จะเป็นโปรแกรมการทำงานที่ซับซ้อน

เชบัง

คำสั่งเดียวทำงานได้ดีตราบใดที่คุณใช้ Bash หรือเชลล์ที่เข้ากันได้กับคำสั่งที่ใช้ในสคริปต์ หากไม่มีการระบุเชลล์ในสคริปต์ เชลล์เริ่มต้นจะถูกใช้เพื่อดำเนินการคำสั่งสคริปต์

งานต่อไปคือการทำให้แน่ใจว่าสคริปต์จะทำงานโดยใช้ Bash shell แม้ว่าเชลล์อื่นจะเป็นค่าเริ่มต้นก็ตาม สิ่งนี้สำเร็จได้ด้วยเส้น shebang Shebang เป็นวิธีที่เกินบรรยายในการอธิบาย #! อักขระที่ระบุอย่างชัดเจนว่าจะใช้เชลล์ใดเมื่อรันสคริปต์ ในกรณีนี้ นั่นคือ Bash แต่อาจเป็นเชลล์อื่นก็ได้ หากไม่ได้ติดตั้งเชลล์ที่ระบุ สคริปต์จะไม่ทำงาน

เพิ่มบรรทัด shebang เป็นบรรทัดแรกของสคริปต์ ดังนั้นตอนนี้จึงมีลักษณะดังนี้:

#!/usr/bin/bash
echo "Hello world!"

เรียกใช้สคริปต์อีกครั้ง—คุณจะไม่เห็นความแตกต่างในผลลัพธ์ หากคุณมีเชลล์อื่นติดตั้งอยู่ (เช่น ksh, csh, tcsh, zsh เป็นต้น) ให้เริ่มเชลล์ใหม่แล้วเรียกใช้สคริปต์อีกครั้ง

สคริปต์เทียบกับโปรแกรมที่คอมไพล์แล้ว

เมื่อเขียนโปรแกรมเพื่อทำให้เป็นอัตโนมัติ—คือ ทุกอย่าง—ผู้ดูแลระบบควรใช้เชลล์สคริปต์เสมอ เนื่องจากเชลล์สคริปต์ถูกจัดเก็บไว้ในรูปแบบข้อความ ASCII มนุษย์จึงสามารถดูและแก้ไขได้ง่ายพอๆ กับที่คอมพิวเตอร์สามารถทำได้ คุณสามารถตรวจสอบโปรแกรมเชลล์และดูว่ามันทำงานอย่างไร และมีข้อผิดพลาดที่ชัดเจนในไวยากรณ์หรือตรรกะหรือไม่ นี่เป็นตัวอย่างที่มีประสิทธิภาพของความหมายของการ เปิด .

ฉันรู้ว่านักพัฒนาบางคนพิจารณาเชลล์สคริปต์บางอย่างที่น้อยกว่าการเขียนโปรแกรม "จริง" การแบ่งส่วนขอบของเชลล์สคริปต์และผู้ที่เขียนสคริปต์เหล่านี้ดูเหมือนจะมีแนวคิดที่ว่าภาษาโปรแกรม "จริง" เท่านั้นคือภาษาที่ต้องรวบรวมจากซอร์สโค้ดเพื่อสร้างโค้ดที่เรียกใช้งานได้ ฉันสามารถบอกคุณได้จากประสบการณ์ว่าสิ่งนี้ไม่เป็นความจริงอย่างเด็ดขาด

ฉันใช้หลายภาษา รวมถึง BASIC, C, C++, Pascal, Perl, Tcl/Expect, REXX (และรูปแบบบางส่วน รวมถึง Object REXX) ​​ภาษาเชลล์หลายภาษา (รวมถึง Korn, csh และ Bash) และแม้แต่การประกอบบางส่วน ภาษา. ภาษาคอมพิวเตอร์ทุกภาษาที่เคยประดิษฐ์ขึ้นมีจุดประสงค์เดียว:เพื่อให้มนุษย์สามารถบอกคอมพิวเตอร์ว่าต้องทำอะไร เมื่อคุณเขียนโปรแกรม ไม่ว่าคุณจะเลือกภาษาใดก็ตาม คุณกำลังให้คำแนะนำคอมพิวเตอร์เพื่อทำงานเฉพาะในลำดับที่เฉพาะเจาะจง

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

การเขียนโปรแกรมอย่างรวดเร็วต้องใช้โปรแกรมเชลล์ เพราะทำให้สามารถตอบสนองความต้องการของลูกค้าได้อย่างรวดเร็ว ไม่ว่าจะเป็นคุณหรือบุคคลอื่น หากมีปัญหากับตรรกะหรือจุดบกพร่องในโค้ด สามารถแก้ไขได้และทดสอบซ้ำเกือบจะในทันที หากข้อกำหนดชุดเดิมมีข้อบกพร่องหรือไม่สมบูรณ์ เชลล์สคริปต์สามารถเปลี่ยนแปลงได้อย่างรวดเร็วเพื่อให้เป็นไปตามข้อกำหนดใหม่ โดยทั่วไป ความจำเป็นในการพัฒนาความเร็วในงานดูแลระบบจะแทนที่ความจำเป็นในการทำให้โปรแกรมทำงานให้เร็วที่สุดเท่าที่เป็นไปได้ หรือใช้น้อยที่สุดเท่าที่จะทำได้ในลักษณะของทรัพยากรระบบ เช่น RAM

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

ความคิดสุดท้าย

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

ในบทความถัดไป คุณจะเริ่มสร้างเทมเพลตสคริปต์ทุบตีที่สามารถใช้เป็นจุดเริ่มต้นสำหรับสคริปต์ทุบตีอื่นๆ เทมเพลตจะประกอบด้วยสิ่งอำนวยความสะดวกความช่วยเหลือ คำชี้แจงสิทธิ์การใช้งาน GNU ฟังก์ชันง่ายๆ จำนวนหนึ่ง และตรรกะบางอย่างในการจัดการกับตัวเลือกเหล่านั้น ตลอดจนสิ่งอื่นที่อาจจำเป็นสำหรับสคริปต์ที่อิงตามเทมเพลตนี้

แหล่งข้อมูล 

  • วิธีตั้งโปรแกรมด้วย Bash:ไวยากรณ์และเครื่องมือ
  • วิธีตั้งโปรแกรมด้วย Bash:ตัวดำเนินการเชิงตรรกะและการขยายเชลล์
  • วิธีตั้งโปรแกรมด้วย Bash:Loops

บทความชุดนี้มีเนื้อหาบางส่วนมาจากเล่มที่ 2 บทที่ 10 ของหลักสูตรการเรียนรู้ด้วยตนเองเกี่ยวกับ Linux แบบสามส่วนของ David Both การใช้งานและการดูแลระบบ Linux—Zero to SysAdmin