2015-12-02 18 views
5

Bir ip dosyasından geçip bunları tek tek okşayan bir bash betiğim var. Her ping için çıkış durumu 0 ise, düğüm, yukarı başka düğüm bu mükemmel çalışmasını almak mümkün down.i, ancak bash komut çıkış durumu sona erdiğinde hep 0.Döngüyü kullanırken Bash çıkış durumu Bitti

olduğunu yankı

Elde etmeye çalıştığım şey, örneğin, 3'üncü başarısız olursa, 5 ip üzerinden çıktı, listeye devam etmek ve geri kalanını kontrol etmek için, ancak komut dosyası, 0'dan başka bir çıkış durumu ve çıktı iptali başarısız olduğunda, çıkıştan çıktı.

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 

şimdiden teşekkürler!

cevap

8

İlk probleminiz, cat file | while read yapılarak, kendi alt kabuğunda while'u ürettiğinizdir. Ayarladığı tüm değişkenler yalnızca bu döngüde mevcut olacaktır, bu yüzden bir değer devam etmek zor olacaktır. Eğer while read ... done < file kullanırsanız More info on that issue here.

doğru çalışacaktır. Varsayılan olarak sıfır olan bir çıkış durumu bayrağı oluşturun, ancak herhangi bir hata meydana gelirse bire ayarlayın. Kodunuzun çıkış değeri olarak kullanın.

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

Bu, aradığım şeyi yapıyor gibi görünüyor. İlk sayının farkında değildim ve anlıyorum. Teşekkür ederim! – user2683183

+0

'cmd; [$? -eq 0]; o zaman neredeyse ** her zaman ** daha iyi ile değiştirilirse eğer cmd; then'. –