Tôi có một tập lệnh bash hiện dài hơn 700 dòng. Sau một vòng chỉnh sửa đặc biệt dài, bây giờ lỗi như vậy:
./run_me.sh: line 693: unexpected EOF while looking for matching `''
./run_me.sh: line 702: syntax error: unexpected end of file
Tuy nhiên, không có gì sai tôi có thể thấy với dòng 693. Thậm chí không có trích dẫn nào về nó.
Tôi đã thử chạy bash -x run_me.sh
và có thể thấy dòng cuối cùng chạy, nhưng dòng đó không có gì sai cả (và mã giữa dòng đó và 693, hầu hết là mã).
Tôi có thể nhận xét toàn bộ các đoạn mã, nhưng sau đó tôi có nhiều khả năng thấy lỗi do thiếu chức năng, v.v., thay vì lỗi EOF tôi đang gặp phải.
Vậy làm thế nào để một người nào đó tìm thấy trích dẫn bị thiếu, nếu số dòng được báo cáo không chính xác?
(Tại sao báo cáo số dòng của bash lại quá xa?)
Biên tập
Tình cờ, tôi đã tìm thấy lỗi cụ thể của mình (bằng cách bình luận swathes), thực sự là một thiếu sót }
trong việc mở rộng biến ở một số dòng tùy ý không ở gần dòng được chỉ ra bởi thông báo lỗi - đánh dấu cú pháp dựa trên trích dẫn không giúp ích ở đây, ví dụ như với niềng răng bị thiếu trong "${MY_ARRAY[@]"
(nên "${MY_ARRAY[@]}"
).
-nv
điều đó, bạn có thể hiểu rõ hơn - các lời nhắc sẽ gợi ý cho bạn. Bạn sẽ nhận được $PS2
khi vỏ có lúc bắt đầu diễn giải một trích dẫn hoặc lớp ghép và không được quản lý đóng mã thông báo đó kể từ khi dòng mới nhất xuất hiện trong đầu vào. Ngoài ra hãy thử: PS4='LAST EXECLINE: $((LAST+!(LAST=LINENO)))'; set -x
bởi vì các lineno đôi khi có thể trở nên khá buồn cười trong các lớp con.
sh -nv <script
như bạn làm. Ngay sau khi thông báo lỗi của bạn thay đổi, bạn đã tìm thấy lệnh ghép trong đó vấn đề của bạn nằm ở đó. Và các số dòng là tốt - mỗi hàm có một số riêng.