Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เชี่ยวชาญการตรวจสอบไวยากรณ์ Shell Script: คู่มือดีบัคปฏิบัติ

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

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

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

การเปิดใช้งาน Verbose Debugging Mode

ก่อนที่เราจะไปที่หัวข้อหลักของคู่มือนี้ ให้สำรวจ verbose mode สั้นๆ มันถูกเปิดใช้งานโดยตัวเลือกการดีบัก -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

การเปิดใช้งาน Syntax Checking Debugging Mode ใน Shell Scripts

กลับมาที่หัวข้อเน้นของเรา ตัวเลือก -n เปิดใช้งาน syntax checking mode มันสั่งให้เชลล์อ่านคำสั่งทั้งหมด แต่ไม่ได้รันมัน มัน (เชลล์) เพียงตรวจสอบไวยากรณ์ที่ใช้

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

ไวยากรณ์สำหรับการเปิดใช้งาน syntax checking คือดังนี้:

$ 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

บันทึกไฟล์ แล้วรันมันขณะทำ syntax checking:

$ bash -n script.sh

จากเอาต์พุทข้างต้น เราเห็นว่ามีปัญหาไวยากรณ์กับสคริปต์ของเรา for loop ขาดคำสำคัญ done และเชลล์มองหาจนจบไฟล์ และเมื่อไม่พบ (done) เชลล์พิมพ์ syntax error:

script.sh: line 11: syntax error: unexpected end of file

เราสามารถรวม verbose mode และ syntax checking mode พร้อมกันได้:

$ bash -vn script.sh

ทางเลือกอื่น เราสามารถเปิดใช้งาน syntax checking โดยแก้ไขบรรทัดแรกของสคริปต์ข้างต้น nhưในตัวอย่างถัดไป

#!/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

เหมือนเดิม บันทึกไฟล์และรันมันขณะทำ syntax checking:

$ ./script.sh script.sh: line 12: syntax error: unexpected end of file

นอกจากนี้ เราสามารถใช้คำสั่ง set shell built-in เพื่อเปิดใช้งานโหมดการดีบักในสคริปต์ข้างต้น

ในตัวอย่างด้านล่าง เรากำลังตรวจสอบไวยากรณ์ของ 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

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

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