2016-09-27 7 views
-1

このスクリプトはhosts文字列配列を使ってpingを試みます。私は「予期しないトークン `他forループで予期しないelseが返される

近く

構文エラーを取得する理由も、これは良い方法があればいくつかのいずれかが私に言うことができるので、もし

for i in "${arr[@]}" 
do 
    echo "check if $i is online" 
    ping -c1 $i &>/dev/null 
    if[ $? -eq 0 ] then 
     echo "$i is online" 
    else 
     echo "$i is not online" 
    fi 
done 

私はbashのスクリプトに新しいです。事前に感謝

+3

あなたのコードをhttp://www.shellcheck.net/に貼り付けてくださいあなたは '$ ['?]の間にスペースを入れてください。 if'。 – fedorqui

答えて

4

[はの構文の一部ではありません。 aまたは8のような通常の文字です。そのため、パーサーはを2つの単語if[と認識しません。それは単にコマンド名の後ろに行の終わりで終わる一連の引数が続くと仮定して、名前がif[と見なされます。次の行も有効なコマンドです。しかし次の行は、elseで始まります。これは認識されたキーワードであるため、コマンド位置には出現できませんが、実行中のifステートメントの一部としてのみエラーが発生します。

とする必要があります。if[にスペースを入れてください。あなたが持っている必要があり

if [ $? -eq 0 ]; then 

(それはあなたがスペースの問題を修正した後に発生した次の問題だろうと同じ行に表示された場合にもthen前にセミコロンが必要です。)

4

行番号6は、セミコロン;であって、ifの後ろにスペースが必要ですif[ $?あなたの行の。

if [ $? -eq 0 ]; then 

より推奨される方法がありますが、直接

if ping -c 1 "$i" &> /dev/null 
then 
    echo "$i is online" 
else 
    echo "$i is not online" 
fi 

としてif文でping's出口コードを使用することができ、私は-cフラグを使用する理由についてman pingページから以下の抜粋を参照してください。

-c count 
     Stop after sending count ECHO_REQUEST packets. With deadline option, ping waits for count ECHO_REPLY packets, until the timeout expires. 

http://www.shellcheck.net/を使用すると、そのような些細な構文エラーをデバッグすることができます。

+0

また、ifと[ – Lennart

+0

';'の間にスペースがないことを修正しました。セミコロンであり、それは問題ですが、直接の問題ではありません。 – chepner

+0

@Lennart:コメントをいただきありがとうございます。今すぐ更新してください! – Inian

2

if [ $? -eq 0 ]; thenif[との間の空白と;

関連する問題