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

标签 linux bash loops ping

<分区>

我有一个 bash 脚本,它遍历一个 ip 列表并一个一个地 ping 它们。如果每个 ping 的退出状态为 0,则回显节点已启动,否则节点已关闭。我能够让它完美地工作,但是当 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你已经生成了 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

关于linux - 使用 while 循环时的 Bash 退出状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34046961/

相关文章:

linux - .bashrc 的奇怪行为

java - 我怎样才能让 Log4j2 登录到我的日志文件,我已经尝试了我能想到的一切,这可能是 linux 中的配置问题吗?

linux - 删除带有嵌入空白的路径中的所有 .SVN 文件夹

java - Java 方法中的标记中断

loops - LOOP关键字列表

java - 我可以通过Java运行交互式脚本吗?

c++ - XShmPutImage 事件通知挂起

bash - 使用命令行 databricks 提交具有不同参数的作业

bash - 从 bash 脚本到无限循环中的 bash 脚本

java.lang.IllegalStateException : Scanner closed