構文エラー:ファイルの予期しない終了— Bashスクリプト[終了]


20

スプリッツアプリを作成しようとしています。すべて正常に動作していましたが、昨日からこのエラーが発生し続けています。

./spritz:176行目:構文エラー:予期しないファイルの終わり

スクリプトファイルを確認しましたが、すべてが完璧に思えます。私は混乱しています、私はついにifステートメントを持っています、そしてそれは正しいようです!最後の部分は次のとおりです。

#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

そのエラーの原因は何ですか?


(0)動作した最後のバージョンとの差分を表示する方が便利だったかもしれません。……………………いくつかの所見(おそらく、現在の特定の問題とは関係ありません):(1);行末にエスケープなし(セミコロン)が必要な状況はわかりません。あなたがライン157、161、165、168の両端にセミコロンを削除して、169(または、あなたがそれらを残すことができます。私はそれがスタイルの問題だと思う)ことができます...(続きを)
スコット・

1
(続き)…(2)正当な理由がない限り、シェル変数を常に引用する必要があります。例えば、"$1""$2""$SECONDS"、と"$starttime"。(3)適切にインデントされたコードを読み、デバッグするのが簡単です。(4)なぜ設定FSしてから使用しないのですか?(5)`…`と書くことができます$(…)。(6)$(($SECONDS - $starttime))同様に記述できます$((SECONDS - starttime))。繰り返しますが、これは基本的にスタイルの問題です。(7)"$words_read"ループで変更しないのに、なぜループで印刷するのですか?
スコット

デバッグアプローチは次のとおりです。行157〜174を削除して、スクリプトを再度実行してください。それでもエラーが表示される場合(おそらく157行目または158行目と報告されている場合)、問題 157 行目から174行目にないことを知っているため、さらにさかのぼって確認する必要があります(エラーがなくなるまでプロセスを繰り返します) )。…(続き)
スコット

(続き)…エラーが解消したら、最後に削除した行を元に戻し、それらの行を削り出します。たとえば、行157〜174を削除してもエラーが消える場合は、元に戻しますが、行159-160、163〜168、および171〜172を削除します。`grep …`を値のリストに置き換えてみてください。言い換えれば、除去のプロセスを使用します。
スコット

スコットのコメントのいくつかに関するコメント:(広告2)あなたがしていることを確信しているなら(投稿されたコードで)"$1"引用する必要があるだけです(広告4)おそらく彼が意味しているIFS(ではないFS)?
ジャニス

回答:


29

診断の「予期しないファイルの終わり」は、一致しないまたは終了していない開始構文構造(ifw / o fidow / o done、関連する終了括弧なしの開き括弧、開いているが終了していない引用符など)があることを示すヒントです。この場合、スクリプトの終わりを指す行番号は役に立たず、構文の構成体を検査するということ以上です。エラーはコードのどこかにある可能性があります。確認する必要があります。


返信いただきありがとうございます。エラーを見つけて修正しました!
スコット・ピアース

-エラーはコードのどこかにある可能性があります。このアドバイスに賛成するためだけにアカウントを作成しました。
user340352
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.