使用while循环时Bash退出状态

时间:2015-12-02 15:48:00

标签: linux bash loops ping

我有一个bash脚本,它通过一个ip列表并逐个ping它们。如果每个ping的退出状态为0,则回显节点已启动,否则节点已关闭。我能够完美地工作,但是当bash脚本结束时,退出状态始终为0。

我想要实现的是例如5个ip中的第3个如果第3个失败,继续通过列表并检查其余部分但是一旦脚本结束抛出除0以外的退出状态并输出哪个ip失败。

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

提前感谢!

1 个答案:

答案 0 :(得分:8)

您的第一个问题是,通过cat file | while read,您已经在自己的子shell中生成了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