Tìm lỗi cú pháp

Một phần của tài liệu Tìm hiểu ngôn ngữ shell script (Trang 28 - 32)

Một trong những lỗi hay gặp nhất khi viết shell script đó là không tuân theo chuẩn cú pháp của shell. Chỉ cần 1 lỗi rất nhỏ cũng khiến script gặp lỗi. Hãy thử xem xét ví dụ dưới đây:

Đoạn script trên có vẻ không có lỗi nào cả, nhưng khi biên dịch sẽ xuất hiện thông báo sau:

Có thể thấy thông báo lỗi không được rõ ràng. Thông báo chỉ ra rằng, có lỗi ở dòng 11, thực chất đây là dòng trống ở cuối file và thông báo “chưa kết thúc file” không chỉ ra chính xác lỗi xảy ra là lỗi gì. Xem xét kỹ đoạn script thì lỗi nằm ở vòng for thiếu từ khóa done, hoạt động của shell như sau: shell không dò ra lỗi nào cho đến hết file, nhưng vòng for vẫn chưa kết thúc nên xuất hiện thông báo chưa kết thúc file. Shell không thể nói về ý tưởng của chúng ta mà nó chỉ có thể xét dựa vào những cú pháp đã tồn tại. Sẽ là tốt hơn nhiều nếu shell đưa ra lời thông báo “for loop started at line 4

without a done statement” thay cho lời thông báo khó hiểu “debug_done: line 11: syntax error: unexpected end of file”.

Như vậy, khi gặp thông báo unexpected end of file thì cần hiểu rằng shell muốn nói something started but didn't end and now I am at the end of the file. Chúng ta cần dò ngược từ cuối file trở lên, tìm những block như if, for, while, do và đa phần lỗi là không có phần kết thúc của block.

Khi chạy script này sẽ xuất hiện thông báo lỗi:

Lần này shell đã hoạt động rất hiệu quả khi chỉ ra rằng thiếu dấu “ tại dòng 6 và vẫn chưa kết thúc file. Tuy nhiên nếu đặt lỗi này trong đoạn script dài hàng nghìn dòng thì sẽ thấy vấn đề quả thật không đơn giản.

Một lỗi nữa mà các lập trình viên script rất hay gặp phải đó là quên những dấu cách, việc nay gây ra rất nhiều vấn đề. Chúng ta hãy thử xem đoạn script debug_sp sau đây:

Ví dụ này cho thấy shell rất nghiêm khắc trong việc xem xét lỗi cú pháp. Tất cả các tag mở đóng đều đầy đủ, đoạn script trông có vẻ không có lỗi nào cả. Tuy nhiên một lỗi nhỏ xuất hiện: thiếu dấu space ở dòng 11:

Đoạn lệnh này sai bởi cách thức mà lệnh if thực hiện. Ở trong các ngôn ngữ khác như C, Java... [ và ] chỉ là thành phần bao câu lệnh nên có dấu cách hay không đều không ảnh hưởng gì đến cú pháp. Còn trong shell, [ chính là 1 lệnh – 1 cách viết tắt của lệnh test. Dấu ] thực chất chỉ là một đối số của lệnh [, như vậy câu lệnh ở trên được shell diễn dịch thành [7 -lt 3 ] và lệnh [7 là không tồn tại nên shell đưa ra thông báo lỗi.

Có thể thấy, tất cả các ví dụ trên đều khá đơn giản, chúng ta không mất quá nhiều công sức để khắc phục nó. Thế nhưng điều đó không đúng khi chúng ta làm việc với đoạn script lớn, được phát triển bởi nhiều người bởi lẽ mỗi người đều có một style code khác nhau.

Có một số điểm kỳ dị - điểm có khả năng gây ra lỗi cao - trong khi lập trình script đó là:

➢ Những thành phần của lệnh được đưa qua pipe tới một lệnh khác.

➢ Các đoạn ghi chú - tuy chúng thực sự hữu dụng nhưng rất dễ gây sai sót. ➢ Đoạn lệnh gọi một lệnh khác chưa được định nghĩa.

➢ Đoạn lệnh sử dụng awk nếu đầu ra không đúng như ta mong muốn.

➢ Đoạn lệnh sử dụng sed nếu script thay đổi số lượng file và các file không được thay đổi chính xác.

➢ Đoạn lệnh chuyển hướng của stderr.

Một phần của tài liệu Tìm hiểu ngôn ngữ shell script (Trang 28 - 32)