ผู้ดูแลระบบมักจะเขียนสคริปต์ทุบตี บางอย่างสั้นและยาวพอสมควร เพื่อทำงานต่างๆ ให้สำเร็จ
คุณเคยดูสคริปต์การติดตั้งจากผู้จำหน่ายซอฟต์แวร์หรือไม่? พวกเขามักจะเพิ่มฟังก์ชันและตรรกะมากมายเพื่อให้แน่ใจว่าการติดตั้งทำงานอย่างถูกต้องและไม่ส่งผลให้ระบบของลูกค้าเสียหาย หลายปีที่ผ่านมา ฉันได้รวบรวมเทคนิคต่างๆ มากมายในการปรับปรุงสคริปต์ Bash ของฉัน และฉันต้องการแบ่งปันบางส่วนโดยหวังว่าจะสามารถช่วยเหลือผู้อื่นได้ นี่คือชุดของสคริปต์ขนาดเล็กที่สร้างขึ้นเพื่อแสดงตัวอย่างง่ายๆ เหล่านี้
เริ่มต้น
เมื่อผมเริ่มต้นใช้งาน สคริปต์ Bash ของฉันไม่มีอะไรมากไปกว่าชุดคำสั่ง ซึ่งมักจะหมายถึงการประหยัดเวลาด้วยการทำงานของเชลล์มาตรฐาน เช่น การปรับใช้เนื้อหาเว็บ งานหนึ่งดังกล่าวคือการแยกเนื้อหาแบบคงที่ลงในโฮมไดเร็กตอรี่ของเว็บเซิร์ฟเวอร์ Apache สคริปต์ของฉันมีลักษณะดังนี้:
cp january_schedule.tar.gz /usr/apache/home/calendar/
cd /usr/apache/home/calendar/
tar zvxf january_schedule.tar.gz
แม้ว่าสิ่งนี้จะช่วยฉันประหยัดเวลาและการพิมพ์ แต่ก็ไม่ใช่สคริปต์ที่น่าสนใจหรือมีประโยชน์ในระยะยาวอย่างแน่นอน เมื่อเวลาผ่านไป ฉันได้เรียนรู้วิธีอื่นๆ ในการใช้สคริปต์ทุบตีเพื่อทำงานที่ท้าทายยิ่งขึ้นให้สำเร็จ เช่น การสร้างแพ็คเกจซอฟต์แวร์ การติดตั้งซอฟต์แวร์ หรือการสำรองไฟล์เซิร์ฟเวอร์
1. คำสั่งแบบมีเงื่อนไข
เช่นเดียวกับภาษาโปรแกรมอื่น ๆ เงื่อนไขเป็นคุณสมบัติที่มีประสิทธิภาพและทั่วไป เงื่อนไขคือสิ่งที่ช่วยให้โปรแกรมคอมพิวเตอร์ดำเนินการตรรกะได้ ตัวอย่างส่วนใหญ่ของฉันอิงตามตรรกะแบบมีเงื่อนไข
เงื่อนไขพื้นฐานใช้คำสั่ง "if" ซึ่งช่วยให้เราสามารถทดสอบเงื่อนไขบางอย่างที่เราสามารถใช้เพื่อจัดการกับการทำงานของสคริปต์ได้ ตัวอย่างเช่น เราสามารถตรวจสอบการมีอยู่ของไดเร็กทอรี Java bin ซึ่งจะระบุว่ามีการติดตั้ง Java หากพบ สามารถอัปเดตพาธปฏิบัติการด้วยตำแหน่งเพื่อเปิดใช้งานการโทรโดยแอปพลิเคชัน Java
if [ -d "$JAVA_HOME/bin" ] ; then
PATH="$JAVA_HOME/bin:$PATH"
2. จำกัดการดำเนินการ
คุณอาจต้องการจำกัดสคริปต์ให้เรียกใช้โดยผู้ใช้ที่ระบุเท่านั้น แม้ว่า Linux จะมีสิทธิ์มาตรฐานสำหรับผู้ใช้และกลุ่ม เช่นเดียวกับ SELinux สำหรับการเปิดใช้งานการป้องกันประเภทนี้ คุณสามารถเลือกวางตรรกะภายในสคริปต์ได้ บางทีคุณอาจต้องการให้แน่ใจว่ามีเพียงเจ้าของเว็บแอปพลิเคชันบางตัวเท่านั้นที่สามารถเรียกใช้สคริปต์เริ่มต้นได้ คุณสามารถใช้โค้ดเพื่อจำกัดสคริปต์ให้กับผู้ใช้รูทได้ Linux มีตัวแปรสภาพแวดล้อมสองสามตัวที่เราสามารถทดสอบได้ในตรรกะนี้ หนึ่งคือ $USER ซึ่งระบุชื่อผู้ใช้ อีกอย่างคือ $UID ซึ่งระบุหมายเลขประจำตัวผู้ใช้ (UID) และ UID ของผู้ใช้ที่ดำเนินการในกรณีของสคริปต์
ผู้ใช้
ตัวอย่างแรกแสดงให้เห็นว่าฉันสามารถจำกัดสคริปต์ให้กับผู้ใช้ jboss1 ในสภาพแวดล้อมแบบ multi-hosting ที่มีอินสแตนซ์ของแอปพลิเคชันเซิร์ฟเวอร์หลายตัวได้อย่างไร คำสั่งแบบมีเงื่อนไข "if" ถามว่า "ผู้ใช้ที่ดำเนินการไม่ใช่ jboss1 หรือไม่" เมื่อพบว่าเงื่อนไขเป็นจริง คำสั่ง echo แรกจะถูกเรียก ตามด้วย exit 1 ซึ่งยุติสคริปต์
if [ "$USER" != 'jboss1' ]; then
echo "Sorry, this script must be run as JBOSS1!"
exit 1
fi
echo "continue script"
รูท
สคริปต์ตัวอย่างถัดไปนี้ช่วยให้แน่ใจว่ามีเพียงผู้ใช้รูทเท่านั้นที่สามารถดำเนินการได้ เนื่องจาก UID สำหรับรูทเป็น 0 เราจึงสามารถใช้ -gt ตัวเลือกในเงื่อนไข if คำสั่งห้าม UID ทั้งหมดที่มากกว่าศูนย์
if [ "$UID" -gt 0 ]; then
echo "Sorry, this script must be run as ROOT!"
exit 1
fi
echo "continue script"
3. ใช้อาร์กิวเมนต์
เช่นเดียวกับโปรแกรมปฏิบัติการอื่น ๆ สคริปต์ Bash สามารถใช้อาร์กิวเมนต์เป็นอินพุตได้ ด้านล่างนี้เป็นตัวอย่างบางส่วน แต่ก่อนอื่น คุณควรเข้าใจว่าการเขียนโปรแกรมที่ดีหมายความว่าเราไม่เพียงแค่เขียนแอปพลิเคชันที่ทำในสิ่งที่เราต้องการ เราต้องเขียนใบสมัครที่ทำไม่ได้ ทำในสิ่งที่ไม่ ต้องการ. ฉันชอบที่จะทำให้แน่ใจว่าสคริปต์จะไม่ทำอันตรายในกรณีที่ไม่มีการโต้แย้ง ดังนั้นนี่คือการตรวจสอบครั้งแรกที่ y เงื่อนไขตรวจสอบจำนวนอาร์กิวเมนต์ $# สำหรับค่าศูนย์และยุติสคริปต์หากเป็นจริง
if [ $# -eq 0 ]; then
echo "No arguments provided"
exit 1
fi
echo "arguments found: $#"
หลายอาร์กิวเมนต์
คุณสามารถส่งผ่านอาร์กิวเมนต์ได้มากกว่าหนึ่งอาร์กิวเมนต์ไปยังสคริปต์ ตัวแปรภายในที่สคริปต์ใช้เพื่ออ้างอิงแต่ละอาร์กิวเมนต์จะเพิ่มขึ้นอย่างง่าย ๆ เช่น $1 , $2 , $3 และอื่นๆ ฉันจะขยายตัวอย่างของฉันด้านบนด้วยบรรทัดต่อไปนี้เพื่อสะท้อนอาร์กิวเมนต์สามข้อแรก เห็นได้ชัดว่าจำเป็นต้องใช้ตรรกะเพิ่มเติมสำหรับการจัดการอาร์กิวเมนต์ที่เหมาะสมตามจำนวนทั้งหมด ตัวอย่างนี้ง่ายสำหรับการสาธิต
echo $1 $2 $3
ในขณะที่เรากำลังพูดถึงตัวแปรอาร์กิวเมนต์เหล่านี้ คุณอาจเคยสงสัยว่า "เขาข้ามศูนย์ไปหรือเปล่า"
ใช่ ฉันทำ แต่ฉันมีเหตุผลที่ดี! มี $0 . อย่างแน่นอน ตัวแปรและมีประโยชน์มาก ค่าของมันเป็นเพียงชื่อของสคริปต์ที่กำลังดำเนินการ
echo $0
เหตุผลสำคัญในการอ้างอิงชื่อของสคริปต์ในระหว่างการดำเนินการคือการสร้างไฟล์บันทึกที่มีชื่อสคริปต์ในชื่อของตัวเอง รูปแบบที่ง่ายที่สุดอาจเป็นแค่คำสั่งเสียงสะท้อน
echo test >> $0.log
อย่างไรก็ตาม คุณอาจต้องการเพิ่มโค้ดอีกเล็กน้อยเพื่อให้แน่ใจว่าบันทึกถูกเขียนไปยังตำแหน่งที่มีชื่อและข้อมูลที่คุณพบว่ามีประโยชน์ต่อกรณีการใช้งานของคุณ
4. ข้อมูลผู้ใช้
คุณลักษณะที่มีประโยชน์อีกประการหนึ่งในสคริปต์คือความสามารถในการรับอินพุตระหว่างการดำเนินการ วิธีที่ง่ายที่สุดคือให้ข้อมูลบางอย่างแก่ผู้ใช้
echo "enter a word please:"
read word
echo $word
นอกจากนี้ยังช่วยให้คุณสามารถให้ตัวเลือกแก่ผู้ใช้ได้
read -p "Install Software ?? [Y/n]: " answ
if [ "$answ" == 'n' ]; then
exit 1
fi
echo "Installation starting..."
5. ออกเมื่อล้มเหลว
เมื่อหลายปีก่อน ฉันเขียนสคริปต์สำหรับติดตั้ง Java Development Kit (JDK) เวอร์ชันล่าสุดบนคอมพิวเตอร์ของฉัน สคริปต์จะแยกไฟล์เก็บถาวร JDK ไปยังไดเร็กทอรีเฉพาะ อัพเดตลิงก์สัญลักษณ์ และใช้ยูทิลิตีทางเลือกอื่นเพื่อทำให้ระบบทราบถึงเวอร์ชันใหม่ หากการแยกไฟล์เก็บถาวร JDK ล้มเหลว การดำเนินการต่ออาจทำให้ Java ทั่วทั้งระบบเสียหาย ดังนั้นฉันจึงต้องการให้สคริปต์ยกเลิกในสถานการณ์เช่นนี้ ฉันไม่ต้องการให้สคริปต์ทำการเปลี่ยนแปลงระบบชุดถัดไป เว้นแต่จะแยกไฟล์เก็บถาวรสำเร็จ ต่อไปนี้เป็นข้อความที่ตัดตอนมาจากสคริปต์นั้น:
tar kxzmf jdk-8u221-linux-x64.tar.gz -C /jdk --checkpoint=.500; ec=$?
if [ $ec -ne 0 ]; then
echo "Installation failed - exiting."
exit 1
fi
วิธีที่รวดเร็วในการสาธิตการใช้งาน $? ตัวแปรมีหนึ่งซับสั้นนี้:
ls T; ec=$?; echo $ec
ขั้นแรก ให้เรียกใช้ แตะ T ตามด้วยคำสั่งนี้ ค่าของ ec จะเป็น 0 จากนั้นลบ T , rm T และทำซ้ำคำสั่ง ค่าของ ec ตอนนี้จะเป็น 2 เพราะ ls รายงานเงื่อนไขข้อผิดพลาดตั้งแต่ T ไม่พบ
คุณสามารถใช้ประโยชน์จากการรายงานข้อผิดพลาดนี้เพื่อรวมตรรกะตามที่ฉันได้อธิบายไว้ข้างต้น เพื่อควบคุมการทำงานของสคริปต์ของคุณ
ซื้อกลับบ้าน
เราอาจสันนิษฐานว่าเราจำเป็นต้องใช้ภาษา เช่น Python, C หรือ Java เพื่อการทำงานที่สูงขึ้น แต่นั่นไม่จำเป็นว่าจะเป็นจริงเสมอไป ภาษาสคริปต์ Bash นั้นทรงพลังมาก มีหลายสิ่งที่ต้องเรียนรู้เพื่อเพิ่มประโยชน์สูงสุด ฉันหวังว่าตัวอย่างเหล่านี้จะช่วยให้เข้าใจถึงศักยภาพของการเข้ารหัสด้วย Bash