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

5 วิธีในการปรับปรุงสคริปต์ทุบตีของคุณ

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

คุณเคยดูสคริปต์การติดตั้งจากผู้จำหน่ายซอฟต์แวร์หรือไม่? พวกเขามักจะเพิ่มฟังก์ชันและตรรกะมากมายเพื่อให้แน่ใจว่าการติดตั้งทำงานอย่างถูกต้องและไม่ส่งผลให้ระบบของลูกค้าเสียหาย หลายปีที่ผ่านมา ฉันได้รวบรวมเทคนิคต่างๆ มากมายในการปรับปรุงสคริปต์ 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