Lỗi cú pháp: kết thúc tệp không mong muốn - Tập lệnh Bash [đã đóng]


20

Tôi đang cố gắng tạo ra một ứng dụng spitz. Mọi thứ đều hoạt động tốt, nhưng từ hôm qua tôi cứ bị lỗi này:

./spritz: dòng 176: lỗi cú pháp: kết thúc tệp không mong muốn

Tôi đã kiểm tra tập tin kịch bản và mọi thứ dường như hoàn hảo. Tôi bối rối, cuối cùng tôi có một câu lệnh if và nó có vẻ đúng! Đây là phần cuối cùng:

#checks if speed is 150
157 if [[ $2 -eq 150 ]];
158 then
159 starttime=$SECONDS
160      FS=$'\n'
161      for j in `grep --color=always -iP '\b[^aeiou\s]*[aeiou][^aeiou\s]*\K[aeiou]' $1`;
162      do
163            #Reads the text file in the centre of the screen
164            echo "                                                    ___________________"
165            echo "                                                             $j";
166            echo "                                                    ___________________"
167            echo "                                                                               Speed 150 wpm"
168            sleep  0.9;
169            clear;
170       done
171 endtime=$(($SECONDS - $starttime))
172            echo "You read $words_read words in $endtime seconds!"
173       exit 8
174 fi

Điều gì có thể gây ra lỗi đó?


(0) Có thể hữu ích hơn khi cho chúng tôi thấy một khác biệt so với phiên bản cuối cùng hoạt động. Một số quan sát (có thể không liên quan đến vấn đề cụ thể hiện tại của bạn): (1) Tôi không biết về bất kỳ tình huống nào mà bạn cần một ;dấu chấm phẩy (dấu chấm phẩy) ở cuối dòng . Bạn có thể xóa dấu chấm phẩy ở cuối các dòng 157, 161, 165, 168 và 169. (Hoặc bạn có thể để chúng vào; Tôi đoán đó là một câu hỏi về phong cách.) Từ (Cont'd)
Scott

1
(Tiếp theo) Nhiều (2) Bạn phải luôn trích dẫn các biến shell trừ khi bạn có lý do chính đáng để không và bạn chắc chắn rằng bạn biết bạn đang làm gì; ví dụ "$1", "$2", "$SECONDS", và "$starttime". (3) Dễ dàng hơn để đọc và gỡ lỗi mã được thụt lề đúng cách. (4) Tại sao bạn cài đặt FSvà sau đó không sử dụng nó? (5) `…`có thể được viết $(…). (6) $(($SECONDS - $starttime))tương đương có thể được viết $((SECONDS - starttime)). Một lần nữa, đây về cơ bản là một vấn đề của phong cách. (7) Tại sao bạn in "$words_read"trong vòng lặp khi bạn không sửa đổi nó trong vòng lặp?
Scott

Đây là một cách tiếp cận gỡ lỗi: Hãy thử xóa các dòng 157-174 và chạy lại tập lệnh. Nếu bạn vẫn gặp lỗi (có thể được báo cáo là ở dòng 157 hoặc 158), thì bạn biết rằng sự cố không nằm ở dòng 157-174 và bạn phải nhìn lại (vì vậy, hãy lặp lại quy trình cho đến khi lỗi biến mất ). Tiết (Cont'd)
Scott

(Tiếp theo) Sau khi lỗi biến mất, hãy đặt các dòng cuối cùng bạn đã xóa lại và bắt đầu xóa chúng đi. Ví dụ: nếu xóa các dòng 157-174 sẽ khiến lỗi không còn nữa, hãy đặt chúng trở lại, nhưng sau đó xóa các dòng 159-160, 163-168 và 171-172. Hãy thử thay thế `grep …`bằng một danh sách các giá trị. Nói cách khác, sử dụng quá trình loại bỏ.
Scott

Nhận xét về một số ý kiến ​​của Scott: (quảng cáo 2) nếu bạn chắc chắn những gì bạn đang làm sau đó (trong mã được đăng) chỉ "$1"cần trích dẫn, (quảng cáo 4) có lẽ ý anh ấy IFS(và không FS)?
Janis

Câu trả lời:


29

Chẩn đoán "kết thúc không mong muốn của tệp" là một gợi ý rằng bạn có một số cấu trúc cú pháp mở chưa từng có hoặc chưa được chỉnh sửa ( ifw / o fi, dow / o done, dấu ngoặc mở w / o đóng một liên kết, mở nhưng dấu ngoặc kép, v.v.). Số dòng chỉ đến cuối tập lệnh không hữu ích trong trường hợp này, ngoài việc nói để kiểm tra các cấu trúc cú pháp của bạn; lỗi có thể là bất cứ nơi nào trong mã của bạn. Bạn phải kiểm tra xem.


Cảm ơn vi đa trả lơi. Tôi đã tìm thấy lỗi và sửa nó!
Scott Pearce

- lỗi có thể là bất cứ nơi nào trong mã của bạn. Tạo tài khoản chỉ để upvote cho lời khuyên này.
dùng340352
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.