Chúng tôi bắt đầu series debug shell script bằng cách giải thích các tùy chọn debug và cách bật chế độ debug shell script.
Sau khi viết shell script, khuyến nghị kiểm tra thực tế cú pháp trước khi chạy, thay vì nhìn đầu ra để xác nhận hoạt động đúng.
Trong phần này, sẽ đi qua cách dùng syntax checking debugging mode. Nhớ chúng tôi giải thích các tùy chọn debug ở phần 1, ở đây sẽ dùng chúng để debug script.
Bật chế độ Verbose Debugging
Trước khi vào trọng tâm, tìm hiểu sơ qua verbose mode. Bật bằng tùy chọn -v, yêu cầu shell hiển thị tất cả dòng trong script khi đọc.
Để minh họa, dưới đây script mẫu batch chuyển đổi ảnh PNG sang JPG.
Gõ (hoặc copy-paste) vào file.
#!/bin/bash
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
done
exit 0
Lưu file và cấp quyền thực thi:
$ chmod +x script.sh
Gọi script hiển thị tất cả dòng khi shell đọc:
$ bash -v script.sh

Bật Syntax Checking Debugging Mode trong Shell Scripts
Quay lại trọng tâm, tùy chọn -n kích hoạt syntax checking mode. Nó chỉ thị shell đọc tất cả lệnh nhưng không thực thi, chỉ kiểm tra cú pháp.
Nếu có lỗi trong script, shell xuất lỗi ra terminal, ngược lại không hiển thị gì.
Cú pháp kích hoạt syntax checking:
$ bash -n script.sh
Vì script đúng cú pháp, lệnh trên không hiển thị đầu ra. Thử xóa từ khóa done đóng vòng lặp for và xem có báo lỗi không:
Script sửa đổi có bug:
#!/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
Lưu file, chạy với syntax checking:
$ bash -n script.sh

Từ đầu ra, thấy vấn đề cú pháp: vòng lặp for thiếu từ khóa đóng done. Shell tìm đến cuối file không thấy done, in lỗi cú pháp:
script.sh: line 11: syntax error: unexpected end of file
Có thể kết hợp verbose mode và syntax checking mode:
$ bash -vn script.sh

Thay vào đó, bật syntax checking bằng cách sửa dòng đầu script:
#!/bin/bash -n
#thay đổi dòng đầu script để bật syntax checking
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
exit 0
Lưu file và chạy với syntax checking:
$ ./script.sh script.sh: line 12: syntax error: unexpected end of file
Ngoài ra, dùng lệnh built-in set bật debug mode trong script.
Trong ví dụ dưới, chỉ kiểm tra cú pháp vòng lặp for:
#!/bin/bash
#dùng set shell built-in command bật debugging
#convert
#bật debugging
set -n
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
#tắt debugging
set +n
exit 0
Lưu file và gọi script:
$ ./script.sh
Tóm lại, luôn đảm bảo kiểm tra cú pháp shell script để bắt lỗi trước khi thực thi.
Gửi câu hỏi hoặc góp ý qua form dưới. Phần 3 series sẽ giải thích và dùng shell tracing debugging mode với ví dụ.