ค้นหาเว็บไซต์

วิธีดำเนินการตรวจสอบไวยากรณ์โหมดดีบักในเชลล์สคริปต์


เราเริ่มต้นซีรีส์การดีบักเชลล์สคริปต์โดยการอธิบายตัวเลือกการดีบักต่างๆ และวิธีการเปิดใช้งานโหมดการดีบักเชลล์สคริปต์

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

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

การเปิดใช้งานโหมดการแก้ไขข้อบกพร่องแบบ 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 

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

หากต้องการส่งคำถามหรือข้อเสนอแนะเกี่ยวกับคู่มือนี้ถึงเรา ให้ใช้แบบฟอร์มตอบกลับด้านล่าง ในส่วนที่สามของชุดนี้ เราจะย้ายไปที่การอธิบายและใช้โหมดการแก้ไขข้อบกพร่องการติดตามเชลล์