2015-12-02 7 views
5

Ho uno script di bash che passa attraverso un elenco di ip e li squilla uno per uno. Se lo stato di uscita per ogni ping è 0, echo che il nodo è attivo, altrimenti il ​​nodo è inattivo. Sono in grado di farlo funzionare perfettamente, ma quando lo script di bash termina lo stato di uscita è sempre 0.Bash exit status quando si utilizza while loop

Quello che sto cercando di ottenere è per esempio su 5 ip se il terzo fallisce, per continuare attraverso l'elenco e controllare il resto, ma una volta che lo script termina lanciare uno stato di uscita diverso da 0 ed emettere quale ip ha fallito.

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 

grazie in anticipo!

risposta

8

Il tuo primo problema è che, eseguendo , hai generato il while nella sua sottotitolazione. Qualsiasi variabile che imposta esisterà solo durante quel ciclo, quindi la persistenza di un valore sarà difficile. More info on that issue here.

Se si utilizza while read ... done < file, funzionerà correttamente. Crea un flag di stato di uscita che per impostazione predefinita è zero, ma impostalo su uno se si verificano errori. Usalo come valore di uscita del tuo script.

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

Questo sembra fare ciò che stavo cercando. Non ero a conoscenza del primo numero e capisco. Grazie! – user2683183

+0

'cmd; se [$? -eq 0]; allora è quasi ** sempre ** meglio sostituito con 'se cmd; then'. –