2015-12-02 10 views
5

私はipのリストを通ってそれらを一つずつpingするbashスクリプトを持っています。各pingの終了ステータスが0の場合、ノードが停止していることをエコーし​​ます。それ以外の場合はノードが停止しています。これを完全に機能させることができますが、bashスクリプトが終了すると常に終了ステータスは0になります。whileループを使用しているときのBashの終了ステータス

私が達成しようとしているのは、例えば、3つ目が失敗した場合は5つのIPのうち、リストを通って残りをチェックするが、スクリプト終了時には0以外の終了ステータスが出力され、

cat list.txt | while read -r output 
do 
    ping -o -c 3 -t 3000 "$output" > /dev/null 
    if [ $? -eq 0 ]; then 
    echo "node $output is up" 
    else 
    echo "node $output is down" 
    fi 
done 

ありがとうございました!

答えて

8

最初の問題は、cat file | while readを実行すると、whileがそれ自身のサブシェルに生成されたことです。設定する変数はそのループ中にのみ存在するため、値を保持するのは難しいでしょう。 More info on that issue here.

while read ... done < fileを使用すると正しく動作します。デフォルトでは終了ステータス終了フラグを作成しますが、エラーが発生した場合は1に設定します。スクリプトの終了値として使用します。

had_errors=0 

while read -r output 
do 
    ping -o -c 3 -t 3000 "$output" > /dev/null 
    if [ $? -eq 0 ]; then 
     echo "node $output is up" 
    else 
     echo "node $output is down" 
     had_errors=1 
    fi 
done < list.txt 

exit $had_errors 
+0

これは私が探していたものと思われます。私は最初の問題を知らなかった、と私は理解する。ありがとうございました! – user2683183

+0

'cmd; if [$? -eq 0]; ''ほとんどの場合、 '' cmd ''に置き換えられます。それから。 –

関連する問題