วิธีดำเนินการตรวจสอบไวยากรณ์โหมดดีบักในเชลล์สคริปต์
เราเริ่มต้นซีรีส์การดีบักเชลล์สคริปต์โดยการอธิบายตัวเลือกการดีบักต่างๆ และวิธีการเปิดใช้งานโหมดการดีบักเชลล์สคริปต์
หลังจากเขียนเชลล์สคริปต์ของคุณแล้ว ขอแนะนำให้เราตรวจสอบไวยากรณ์ในสคริปต์ก่อนที่จะรันสคริปต์ แทนที่จะดูที่เอาต์พุตเพื่อยืนยันว่าสคริปต์ทำงานอย่างถูกต้อง
ในส่วนนี้ของชุดนี้ เราจะอธิบายวิธีใช้โหมดตรวจแก้จุดบกพร่องการตรวจสอบไวยากรณ์ โปรดจำไว้ว่าเราได้อธิบายตัวเลือกการแก้ไขข้อบกพร่องต่างๆ ไว้ในส่วนแรกของชุดข้อมูลนี้ และที่นี่ เราจะใช้ตัวเลือกเหล่านี้เพื่อดำเนินการแก้ไขข้อบกพร่องสคริปต์
การเปิดใช้งานโหมดการแก้ไขข้อบกพร่องแบบ Verbose
ก่อนที่เราจะไปยังจุดสนใจหลักของคู่มือนี้ ให้เราสำรวจโหมดรายละเอียดโดยย่อ มันถูกเปิดใช้งานโดยตัวเลือกการดีบัก -v
ซึ่งบอกให้เชลล์แสดงบรรทัดทั้งหมดในสคริปต์ในขณะที่อ่าน
เพื่อสาธิตวิธีการทำงาน ด้านล่างนี้คือตัวอย่างเชลล์สคริปต์สำหรับแปลงรูปภาพ PNG เป็นรูปแบบ JPG เป็นกลุ่ม
พิมพ์ (หรือคัดลอกและวาง) ในไฟล์
#!/bin/bash
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
done
exit 0
จากนั้นบันทึกไฟล์และทำให้สคริปต์ปฏิบัติการได้โดยใช้คำสั่งด้านล่าง:
chmod +x script.sh
เราสามารถเรียกใช้สคริปต์และแสดงบรรทัดทั้งหมดในนั้นในขณะที่เชลล์อ่านดังนี้:
bash -v script.sh
การเปิดใช้งานการตรวจสอบไวยากรณ์โหมดดีบักในเชลล์สคริปต์
กลับมาที่หัวข้อเน้นของเรา -n
เปิดใช้งานโหมดการตรวจสอบไวยากรณ์ โดยจะสั่งให้เชลล์อ่านคำสั่งทั้งหมดโดยทั่วไป อย่างไรก็ตาม จะไม่ดำเนินการคำสั่งเหล่านั้น แต่ (เชลล์) จะตรวจสอบเฉพาะไวยากรณ์ที่ใช้เท่านั้น
ในกรณีที่มีข้อผิดพลาดในเชลล์สคริปต์ของคุณ เชลล์จะส่งเอาต์พุตข้อผิดพลาดบนเทอร์มินัล มิฉะนั้น จะไม่แสดงอะไรเลย
ไวยากรณ์สำหรับการเปิดใช้งานการตรวจสอบไวยากรณ์มีดังนี้:
bash -n script.sh
เนื่องจากไวยากรณ์ในสคริปต์ถูกต้อง คำสั่งด้านบนจะไม่แสดงผลใดๆ ดังนั้น ให้เราลองลบคำ done
ที่ปิด for loop และดูว่ามันแสดงข้อผิดพลาดหรือไม่:
ด้านล่างนี้คือเชลล์สคริปต์ที่ได้รับการแก้ไขเพื่อแปลงรูปภาพ PNG เป็นรูปแบบ jpg ที่มีข้อบกพร่องเป็นชุด
#!/bin/bash
#script with a bug
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
exit 0
บันทึกไฟล์ จากนั้นรันในขณะที่ดำเนินการตรวจสอบไวยากรณ์ในไฟล์:
bash -n script.sh
จากผลลัพธ์ข้างต้น เราจะเห็นว่าสคริปต์ของเรามีปัญหาด้านไวยากรณ์ for loop ไม่มีคำสำคัญที่ done
ปิดอยู่ และเชลล์ค้นหามันจนถึงจุดสิ้นสุดของไฟล์ และเมื่อไม่พบมัน (เสร็จสิ้น) เชลล์ก็พิมพ์ข้อผิดพลาดทางไวยากรณ์:
script.sh: line 11: syntax error: unexpected end of file
เราสามารถรวมโหมด verbose และโหมดการตรวจสอบไวยากรณ์เข้าด้วยกันได้เช่นกัน:
bash -vn script.sh
อีกทางหนึ่ง เราสามารถเปิดใช้งานการตรวจสอบไวยากรณ์โดยแก้ไขบรรทัดแรกของสคริปต์ด้านบนดังตัวอย่างถัดไป
#!/bin/bash -n
#altering the first line of a script to enable syntax checking
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
exit 0
เหมือนเมื่อก่อน ให้บันทึกไฟล์และรันในขณะที่ทำการตรวจสอบไวยากรณ์:
./script.sh
script.sh: line 12: syntax error: unexpected end of file
นอกจากนี้ เราสามารถใช้คำสั่ง set shell ในตัวเพื่อเปิดใช้งานโหมดการดีบักในสคริปต์ด้านบน
ในตัวอย่างด้านล่าง เรากำลังตรวจสอบเฉพาะไวยากรณ์ของ for loop ในสคริปต์ของเราเท่านั้น
#!/bin/bash
#using set shell built-in command to enable debugging
#convert
#enable debugging
set -n
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
#disable debugging
set +n
exit 0
บันทึกไฟล์และเรียกใช้สคริปต์อีกครั้ง:
./script.sh
โดยสรุป เราควรตรวจสอบให้แน่ใจเสมอว่าเราตรวจสอบเชลล์สคริปต์ทางไวยากรณ์เพื่อจับข้อผิดพลาดก่อนที่จะดำเนินการ
หากต้องการส่งคำถามหรือข้อเสนอแนะเกี่ยวกับคู่มือนี้ถึงเรา ให้ใช้แบบฟอร์มตอบกลับด้านล่าง ในส่วนที่สามของชุดนี้ เราจะย้ายไปที่การอธิบายและใช้โหมดการแก้ไขข้อบกพร่องการติดตามเชลล์