Sözdizimi Hatası: beklenmeyen dosya sonu - Bash betiği [kapalı]


20

Bir spritz uygulaması oluşturmaya çalışıyorum. Her şey iyi çalışıyordu, ama dünden beri bu hatayı almaya devam ediyorum:

./spritz: satır 176: sözdizimi hatası: beklenmeyen dosya sonu

Ben komut dosyasını kontrol ettim ve her şey mükemmel görünüyor. Kafam karıştı, sonunda bir if ifadem var ve doğru görünüyor! İşte son bölüm:

#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

Bu hataya ne sebep olabilir?


(0) Bize çalışan son sürümden bir fark göstermek daha yararlı olabilirdi. …………………… Bazı gözlemler (muhtemelen mevcut, spesifik probleminizle ilgili değildir): (1) ;Bir satırın sonunda kaçamayan (noktalı virgül) ihtiyacınız olan hiçbir durum bilmiyorum . 157, 161, 165, 168 ve 169 satırlarının uçlarındaki noktalı virgülleri silebilirsiniz. (Ya da onları bırakabilirsiniz; sanırım bu bir stil meselesidir.)… (Devam)
Scott

1
(Devam)… (2) Yapmamak için iyi bir nedeniniz olmadıkça ve ne yaptığınızı bildiğinizden emin olmadıkça daima kabuk değişkenlerini belirtmelisiniz; örneğin "$1", "$2", "$SECONDS", ve "$starttime". (3) Doğru girintili olan kodu okumak ve hata ayıklamak daha kolaydır. (4) Neden ayarlıyorsunuz FSve sonra kullanmıyorsunuz? (5) `…`yazılabilir $(…). (6) $(($SECONDS - $starttime))eşdeğer olarak yazılabilir $((SECONDS - starttime)). Yine, bu temelde bir stil meselesidir. (7) Döngüde değiştirmediğinizde neden "$words_read"döngüde yazdırıyorsunuz ?
Scott

İşte bir hata ayıklama yaklaşımı: 157-174 satırlarını silmeyi ve komut dosyasını tekrar çalıştırmayı deneyin. Hatayı hala alıyorsanız (muhtemelen 157 veya 158 satırında olduğu bildiriliyor), sorunun 157-174 satırlarında olmadığını biliyorsunuz ve daha geriye bakmanız gerekiyor (bu nedenle, hata giderilinceye kadar işlemi tekrarlayın. ). … (Devamı)
Scott

(Devam)… Hata ortadan kalktığında, sildiğiniz son satırları geri koyun ve onlara atlamaya başlayın. Örneğin, 157-174 satırlarını silmek hatayı ortadan kaldırırsa, onları tekrar yerleştirin, ancak 159-160, 163-168 ve 171-172 satırlarını silin. Değerini `grep …`bir değer listesiyle değiştirmeyi deneyin . Başka bir deyişle, eleme sürecini kullanın.
Scott

Scott'ın yorumlarından birkaçı hakkında açıklamalar: (reklam 2) ne yaptığınızdan eminseniz (yayınlanan kodda) sadece "$1"alıntıya ihtiyaç duyar, (reklam 4) muhtemelen o demekti IFS(değil FS)?
Janis

Yanıtlar:


29

Teşhis "beklenmeyen dosya sonu" bazı eşleşmeyen veya sonlandırılmamış açılış sözdizimsel yapısına ( ifw / o fi, dow / o done, ilişkili kapanışa sahip olmayan açma parantezlerine, açma ama sonlandırılmamış tırnaklara vb.) Sahip olduğunuza dair bir ipucudur . Komut dosyasının sonuna işaret eden satır numarası, sözdizimsel yapılarınızı denetlemeyi söylemenin ötesinde, bu durumda yardımcı olmaz; hata kodunuzun herhangi bir yerinde olabilir. Bunu kontrol etmelisin.


Cevap için teşekkürler. Hatayı buldum ve düzelttim!
Scott Pearce

- hata kodunuzun herhangi bir yerinde olabilir. Bu tavsiye için sadece oy vermek üzere hesap oluşturuldu.
user340352
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.