Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

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

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

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

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

การเปิดใช้งานโหมดการดีบักแบบละเอียด

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

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

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