<ก่อนหน้านี้ | Contents | ถัดไป>
หากคุณต้องการ พรอมต์สามารถรันเชลล์สคริปต์และทำงานแตกต่างกันภายใต้เงื่อนไขที่ต่างกัน คุณยังสามารถให้เสียงเตือนเล่นเพลงทุกครั้งที่คุณออกคำสั่ง แม้ว่าสิ่งนี้จะน่าเบื่อในไม่ช้า ข้อมูลเพิ่มเติมสามารถพบได้ใน Bash-Prompt HOWTO
7.2.5. เชลล์สคริปต์
7.2.5.1. สคริปต์คืออะไร
เชลล์สคริปต์ ตามที่เราเห็นในตัวอย่างคอนฟิกูเรชันเชลล์ ไฟล์ข้อความที่มีคำสั่งเชลล์ เมื่อไฟล์ดังกล่าวถูกใช้เป็นอาร์กิวเมนต์ที่ไม่มีตัวเลือกแรกเมื่อเรียกใช้ Bash และไม่ใช่ -c ไม่ -s มีตัวเลือกให้ Bash อ่านและรันคำสั่งจากไฟล์จากนั้นออกจากไฟล์ โหมดการทำงานนี้สร้าง a
เชลล์ที่ไม่โต้ตอบ เมื่อ Bash รันเชลล์สคริปต์ มันจะตั้งค่าพารามิเตอร์พิเศษ 0 เป็นชื่อของไฟล์ แทนที่จะเป็นชื่อของเชลล์ และพารามิเตอร์ตำแหน่ง (ทุกอย่างที่ตามหลังชื่อของสคริปต์) จะถูกตั้งค่าเป็นอาร์กิวเมนต์ที่เหลือ หากมี หากไม่มีอาร์กิวเมนต์เพิ่มเติม พารามิเตอร์ตำแหน่งจะไม่ถูกตั้งค่า
เชลล์สคริปต์สามารถเรียกใช้งานได้โดยใช้คำสั่ง chmod คำสั่งเปิดบิตดำเนินการ เมื่อ Bash พบไฟล์ดังกล่าวขณะค้นหา เส้นทาง สำหรับคำสั่ง จะเรียก sub-shell เพื่อดำเนินการ กล่าวอีกนัยหนึ่งการดำเนินการ
ชื่อไฟล์ อาร์กิวเมนต์
เทียบเท่ากับการดำเนินการ
ทุบตี ชื่อไฟล์ ARGUMENTS
ถ้า "ชื่อไฟล์" เป็นเชลล์สคริปต์ที่เรียกใช้งานได้ เชลล์ย่อยนี้เริ่มต้นตัวเองใหม่ เพื่อให้เอฟเฟกต์เหมือนกับว่าเชลล์ใหม่ถูกเรียกใช้เพื่อตีความสคริปต์ ยกเว้นว่าตำแหน่งของคำสั่งที่พาเรนต์จำได้ (ดู กัญชา ในหน้าข้อมูล) เด็กจะเก็บไว้
UNIX เวอร์ชันส่วนใหญ่ทำให้สิ่งนี้เป็นส่วนหนึ่งของกลไกการดำเนินการคำสั่งของระบบปฏิบัติการ หากบรรทัดแรกของสคริปต์ขึ้นต้นด้วยอักขระสองตัว "#!" ส่วนที่เหลือของบรรทัดจะระบุล่ามสำหรับโปรแกรม ดังนั้น คุณสามารถระบุ ทุบตี, awk, Perl หรือล่ามหรือเชลล์อื่น ๆ และเขียนส่วนที่เหลือของไฟล์สคริปต์ในภาษานั้น
อาร์กิวเมนต์ของล่ามประกอบด้วยอาร์กิวเมนต์ทางเลือกเดียวตามหลังชื่อล่ามในบรรทัดแรกของไฟล์สคริปต์ ตามด้วยชื่อของไฟล์สคริปต์ ตามด้วยอาร์กิวเมนต์ที่เหลือ Bash จะดำเนินการนี้กับระบบปฏิบัติการที่ไม่ได้จัดการเอง
สคริปต์ทุบตีมักขึ้นต้นด้วย
#! / bin / bash (สมมติว่า Bash ได้รับการติดตั้งใน / bin) เนื่องจากสิ่งนี้ทำให้มั่นใจได้ว่า Bash จะถูกใช้ในการตีความสคริปต์ แม้ว่าจะรันภายใต้เชลล์อื่นก็ตาม
7.2.5.2. ตัวอย่างง่ายๆ
สคริปต์ง่ายๆ ที่ประกอบด้วยคำสั่งเดียว กล่าวทักทายผู้ใช้ที่ดำเนินการ:
[เจอร์รี่@ไม่มีที่ไหนเลย ~] แมว สวัสดี.sh
#! / bin / ทุบตี
เสียงสะท้อน "สวัสดี $USER"
[เจอร์รี่@ไม่มีที่ไหนเลย ~] แมว สวัสดี.sh
#! / bin / ทุบตี
เสียงสะท้อน "สวัสดี $USER"
จริง ๆ แล้วสคริปต์ประกอบด้วยคำสั่งเดียวเท่านั้น เสียงสะท้อนซึ่งใช้ไฟล์ ค่าของ ($) ที่ USER ตัวแปรสภาพแวดล้อมเพื่อพิมพ์สตริงที่ปรับแต่งให้กับผู้ใช้ที่ออกคำสั่ง
สายการบินอื่นที่ใช้สำหรับแสดงผู้ใช้ที่เชื่อมต่อ:
#! / bin / ทุบตี
ใคร | ตัด -d " " -f 1 | เรียงลำดับ -u
#! / bin / ทุบตี
ใคร | ตัด -d " " -f 1 | เรียงลำดับ -u
นี่คือสคริปต์ที่ประกอบด้วยบรรทัดเพิ่มเติม ที่ฉันใช้เพื่อสร้างสำเนาสำรองของไฟล์ทั้งหมดในไดเร็กทอรี สคริปต์สร้างรายการไฟล์ทั้งหมดในไดเร็กทอรีปัจจุบันก่อนและใส่ไว้ในตัวแปร รายการ. จากนั้นจะตั้งชื่อการคัดลอกสำหรับแต่ละไฟล์ จากนั้นจึงคัดลอกไฟล์ สำหรับแต่ละไฟล์ จะมีการพิมพ์ข้อความ:
ไทล์:~> cat bin/makebackupfiles.sh
#! / bin / ทุบตี
# ทำสำเนาของไฟล์ทั้งหมดในไดเรกทอรี LIST=`ls`
สำหรับฉันใน $LIST; ทำ
ORIG=$i
DEST=$i.เก่า
cp $ORIG $DEST echo "คัดลอก $i แล้ว"
ทำ
ไทล์:~> cat bin/makebackupfiles.sh
#! / bin / ทุบตี
# ทำสำเนาของไฟล์ทั้งหมดในไดเรกทอรี LIST=`ls`
สำหรับฉันใน $LIST; ทำ
ORIG=$i
DEST=$i.เก่า
cp $ORIG $DEST echo "คัดลอก $i แล้ว"
ทำ
แค่เข้าไลน์เหมือน mv * *.เก่า ใช้งานไม่ได้ เนื่องจากคุณจะสังเกตเห็นเมื่อลองใช้กับชุดไฟล์ทดสอบ หนึ่ง เสียงสะท้อน เพิ่มคำสั่งเพื่อแสดงกิจกรรมบางอย่าง เสียงสะท้อนโดยทั่วไปจะมีประโยชน์เมื่อสคริปต์ไม่ทำงาน: แทรกหนึ่งรายการหลังจากแต่ละขั้นตอนที่สงสัย และคุณจะพบข้อผิดพลาดในเวลาไม่นาน
การขอ /etc/rc.d/init.d ไดเร็กทอรีมีตัวอย่างมากมาย ลองดูสคริปต์นี้ที่ควบคุมเซิร์ฟเวอร์ ICanSeeYou ที่สมมติขึ้น:
# / bin / sh
# คำอธิบาย: ICanSeeYou ช่วยให้คุณเห็นผู้คนในเครือข่าย
# ชื่อกระบวนการ: ICanSeeYou
# ไฟล์ pid: /var/run/ICanSeeYou/ICanSeeYou.pid
# การตั้งค่า: /etc/ICanSeeYou.cfg
# ไลบรารีฟังก์ชันแหล่งที่มา
. /etc/rc.d/init.d/ฟังก์ชั่น
# ดูว่าเราถูกเรียก (ด้วยข้อโต้แย้งใด) กรณี "$1" ใน
เริ่ม)
echo -n "การเริ่มต้น ICanSeeYou: " daemon ICanSeeYou
เสียงสะท้อน
แตะ /var/lock/subsys/ICanSeeYou
;;
หยุด)
echo -n "กำลังปิด ICanSeeYou: "
# / bin / sh
# คำอธิบาย: ICanSeeYou ช่วยให้คุณเห็นผู้คนในเครือข่าย
# ชื่อกระบวนการ: ICanSeeYou
# ไฟล์ pid: /var/run/ICanSeeYou/ICanSeeYou.pid
# การตั้งค่า: /etc/ICanSeeYou.cfg
# ไลบรารีฟังก์ชันแหล่งที่มา
. /etc/rc.d/init.d/ฟังก์ชั่น
# ดูว่าเราถูกเรียก (ด้วยข้อโต้แย้งใด) กรณี "$1" ใน
เริ่ม)
echo -n "การเริ่มต้น ICanSeeYou: " daemon ICanSeeYou
เสียงสะท้อน
แตะ /var/lock/subsys/ICanSeeYou
;;
หยุด)
echo -n "กำลังปิด ICanSeeYou: "
killproc ICanSeeYou เสียงสะท้อน
rm -f /var/lock/subsys/ICanSeeYou
rm -f /var/run/ICanSeeYou/ICanSeeYou.pid
;;
สถานะ)
สถานะ ICanSeeYou
;;
รีสตาร์ท)
$0 หยุด
เริ่มต้น $0
;;
*)
echo "การใช้งาน: $0 {start|stop|restart|status}" exit 1
ว่า C
ทางออก 0
killproc ICanSeeYou เสียงสะท้อน
rm -f /var/lock/subsys/ICanSeeYou
rm -f /var/run/ICanSeeYou/ICanSeeYou.pid
;;
สถานะ)
สถานะ ICanSeeYou
;;
รีสตาร์ท)
$0 หยุด
เริ่มต้น $0
;;
*)
echo "การใช้งาน: $0 {start|stop|restart|status}" exit 1
ว่า C
ทางออก 0
ประการแรก กับ . command (dot) ชุดของฟังก์ชันเชลล์ที่ใช้โดยเชลล์สคริปต์เกือบทั้งหมดใน
/etc/rc.d/init.d, กำลังโหลด แล้ว a กรณี มีการออกคำสั่ง ซึ่งกำหนด 4 วิธีที่แตกต่างกันที่สคริปต์สามารถดำเนินการได้ ตัวอย่างอาจเป็น ไอแคนซียู เริ่มต้น. การตัดสินใจว่าจะใช้กรณีใดโดยการอ่านอาร์กิวเมนต์ (แรก) ของสคริปต์ด้วยนิพจน์ $1.
เมื่อไม่มีการป้อนข้อมูลที่สอดคล้อง จะใช้กรณีเริ่มต้นที่มีเครื่องหมายดอกจัน ซึ่งสคริปต์จะแสดงข้อความแสดงข้อผิดพลาด NS กรณี รายการลงท้ายด้วย ว่า C คำแถลง. ใน เริ่มต้น กรณีที่โปรแกรมเซิร์ฟเวอร์เริ่มทำงานเป็น daemon และกำหนด ID โปรเซสและล็อกไว้ ใน หยุด กรณีที่กระบวนการของเซิร์ฟเวอร์ถูกติดตามและหยุดลง และการล็อกและ PID จะถูกลบออก ตัวเลือก เช่น ภูต ตัวเลือกและฟังก์ชั่นเช่น ฆ่าถูกกำหนดไว้ใน /etc/rc.d/init.d/ฟังก์ชั่น ไฟล์. การตั้งค่านี้เฉพาะสำหรับการแจกจ่ายที่ใช้ในตัวอย่างนี้ initscripts ในระบบของคุณอาจใช้ฟังก์ชันอื่น กำหนดไว้ในไฟล์อื่น หรือไม่มีเลย
เมื่อสำเร็จ สคริปต์จะส่งคืนรหัสทางออกที่เป็นศูนย์ไปยังพาเรนต์
สคริปต์นี้เป็นตัวอย่างที่ดีของการใช้ฟังก์ชัน ซึ่งทำให้อ่านสคริปต์ได้ง่ายขึ้นและทำงานเสร็จเร็วขึ้น โปรดทราบว่าพวกเขาใช้ sh แทน ทุบตีเพื่อให้มีประโยชน์ในระบบที่หลากหลายขึ้น บนระบบ Linux เรียก ทุบตี as sh ส่งผลให้เชลล์ทำงานในโหมดที่สอดคล้องกับ POSIX