Bash 使用 while 循环时的退出状态

Bash exit status when using while loop

我有一个 bash 脚本,它遍历一个 ip 列表并一个一个地 ping 它们。如果每个 ping 的退出状态为 0,则回显节点已启动,否则节点为 down.I 我能够使其完美运行,但是当 bash 脚本结束时退出状态为总是 0.

例如,如果第 3 个失败,我想要实现的是 5 个 ip,继续遍历列表并检查其余部分,但是一旦脚本结束,就会抛出 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

提前致谢!

您的第一个问题是,通过执行 cat file | while read,您已经在其自己的子 shell 中生成了 while。它设置的任何变量只会在该循环期间存在,因此持久化一个值将很困难。 More info on that issue here.

如果您使用 while read ... done < file,它将正常工作。制作一个默认为零的退出状态标志,但如果发生任何错误,请将其设置为一。将其用作脚本的退出值。

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