Kesalahan Sintaks: akhir file tak terduga - Skrip Bash [ditutup]


20

Saya mencoba membuat aplikasi spritz. Semuanya berfungsi dengan baik, tapi sejak kemarin saya terus mendapatkan kesalahan ini:

./spritz: baris 176: kesalahan sintaks: akhir file yang tak terduga

Saya telah memeriksa file skrip dan semuanya tampak sempurna. Saya bingung, akhirnya saya memiliki pernyataan if dan itu terlihat benar! Ini bagian terakhir:

#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

Apa yang bisa menyebabkan kesalahan itu?


(0) Mungkin lebih bermanfaat untuk menunjukkan kepada kita perbedaan dari versi terakhir yang berfungsi. ... ... ... ... ... ... ... ... Beberapa pengamatan (yang mungkin tidak berhubungan dengan masalah spesifik Anda saat ini): (1) Saya tidak tahu keadaan apa pun di mana Anda memerlukan ;tanda titik koma di akhir baris . Anda dapat menghapus titik koma di ujung baris 157, 161, 165, 168, dan 169. (Atau Anda dapat membiarkannya; Saya kira ini masalah gaya.) ... (Lanjutkan)
Scott

1
(Lanjutan) ... (2) Anda harus selalu mengutip variabel shell kecuali Anda memiliki alasan yang baik untuk tidak melakukannya dan Anda yakin tahu apa yang Anda lakukan; misalnya, "$1", "$2", "$SECONDS", dan "$starttime". (3) Lebih mudah untuk membaca dan men-debug kode yang indentasi dengan benar. (4) Mengapa Anda mengatur FSdan kemudian tidak menggunakannya? (5) `…`dapat ditulis $(…). (6) $(($SECONDS - $starttime))dapat ditulis secara setara $((SECONDS - starttime)). Sekali lagi, ini pada dasarnya masalah gaya. (7) Mengapa Anda mencetak "$words_read"dalam loop ketika Anda tidak memodifikasinya dalam loop?
Scott

Inilah pendekatan debugging: Coba hapus baris 157-174 dan jalankan kembali skrip. Jika Anda masih mendapatkan kesalahan (mungkin dilaporkan berada di baris 157 atau 158), maka Anda tahu masalahnya tidak ada di baris 157-174, dan Anda harus melihat lebih jauh ke belakang (jadi, ulangi prosesnya sampai kesalahan hilang. ). … (Lanjutan)
Scott

(Lanjutkan) ... Setelah kesalahan hilang, masukkan baris terakhir yang Anda hapus kembali, dan mulailah menghapusnya. Misalnya, jika menghapus baris 157-174 tidak membuat kesalahan hilang, masukkan kembali, tetapi kemudian hapus baris 159-160, 163-168, dan 171-172. Coba ganti `grep …`dengan daftar nilai. Dengan kata lain, gunakan proses eliminasi.
Scott

Mengomentari beberapa komentar Scott: (iklan 2) jika Anda yakin apa yang Anda lakukan maka (dalam kode yang diposting) hanya "$1"perlu mengutip, (iklan 4) mungkin maksudnya IFS(dan tidak FS)?
Janis

Jawaban:


29

Diagnostik "akhir yang tak terduga dari file" adalah petunjuk bahwa Anda memiliki beberapa tertandingi atau tidak terselesaikan pembukaan sintaksis konstruk ( ifw / o fi, dow / o done, kurung pembukaan w / o satu, pembukaan terkait penutupan tapi kutipan tidak terselesaikan, dll). Nomor baris yang menunjuk ke akhir skrip tidak membantu dalam kasus ini, selain mengatakan untuk memeriksa konstruksi sintaksis Anda; kesalahan mungkin ada di mana saja dalam kode Anda. Anda harus memeriksanya.


Terima kasih balasannya. Saya telah menemukan kesalahan dan memperbaikinya!
Scott Pearce

- kesalahan mungkin ada di mana saja dalam kode Anda. Membuat akun hanya untuk mendukung saran ini.
user340352
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.