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