2016-07-26 13 views
0

私はbashスクリプティングには新しく、atm私はそれを学ぼうとしています。Bash - whileループの構文エラー

私は、このbashのコードを実行すると:

#!/bin/bash 
while true 
do 
./pokecli.py 
echo ">pokecli exited... restarting..."; 
sleep 5; 
done;  

を、私はこのエラーが表示されます。

opt/PokemonGo-Bot# ./start.sh       ./start.sh: line 6: syntax error near unexpected token  `done' 
./start.sh: line 6: `done;' 

すべてのヘルプは

+3

これはPOSIXシェルでは再現できません。あなたのスクリプトにはそれ以上のものがありますか、またはあなたのスクリプトにはDOSの行末がありますか? (おそらくそうは思われませんが、時にはそのようなエンディングがどんなエラーを生成するかを予測することは難しいです。) – chepner

+1

また、再現できません。どのようなbashを使用していますか?ここではランダムな提案があります:bashの行末でセミコロンは必要ありません。おそらく、 'done'の後にセミコロンを取り除いて、それが役立つかどうかを見てみましょう。 –

+0

これを再現できます。あなたは私に次のコマンドの結果を表示することができます cat pokecli.py –

答えて

-2

を高く評価され、正しい構文はサンプルながら

7.3

 #!/bin/bash 
    COUNTER=0 
    while [ $COUNTER -lt 10 ]; do 
     echo The counter is $COUNTER 
     let COUNTER=COUNTER+1 
    done 

だから、あなたはあなたがそれを必要としないだセミコロンを持って

#!/bin/bash 
while true; do 
    ./pokecli.py 
    echo ">pokecli exited... restarting..."; 
    sleep 5; 
done 
+0

http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html – Pietro

+3

次の行に 'do'を置くことには何も問題ありません。セミコロンまたは ';'は、その前のコマンドを終了します。他のセミコロンは重複していますが無害です。 – chepner

0

に変更する必要があります。また、ネストされたコマンドのインデントを開始し、読みやすくするためにwhileと同じ行にdoを取得する必要があります。加えて、「真実」は危険であり、「睡眠」はより良い。

#!/bin/bash 
while sleep 5; do 
    ./pokecli.py 
    echo ">pokecli exited... restarting..." 
done 

しかし、言われていることはどれもエラーを引き起こすとは言えません。ほとんどの場合、doをタイプミスしたか、コメントアウトしているか、または^ Mなどのように "do"の前にWindows(または他の特殊文字)を持っている可能性があります。 dos2unixコマンドが役に立ちます。

tr -cd '[:graph:]\n\t ' <start.sh >file.tmp && mv file.tmp start.sh

もう一度スクリプトをchmod +xする必要があります。