Bash: 循环直到命令退出状态等于0

43

我在本地机器上安装了netcat并且有一个运行在25565端口的服务。使用以下命令:

nc 127.0.0.1 25565 < /dev/null; echo $?

Netcat 检查端口是否打开,如果打开则返回 0,如果关闭则返回 1。

我正在尝试编写一个 bash 脚本,无限循环并每秒执行上述命令,直到命令的输出等于 0(端口打开)。

我的当前脚本只是不断循环 "...",即使端口打开后(1 变为 0)也是如此。

until [ "nc 127.0.0.1 25565 < /dev/null; echo $?" = "0" ]; do
         echo "..."
         sleep 1
     done
echo "The command output changed!"

我在这里做错了什么?


1
您实际上并未运行nc命令,它只是一个字符串。 - Mark Setchell
只是一个建议,你是否尝试过使用反引号()而不是双引号来包裹nc 127.0.0.1 25565 < /dev/null; echo $?` ? - csiu
3个回答

108

保持简单

Bash和其他sh shell提供了一个until ... do ... done循环

until nc -z 127.0.0.1 25565
do
    echo ...
    sleep 1
done

只需让shell隐式处理退出状态
shell可以以两种方式处理退出状态(记录在$?中),显式和隐式。
显式:status=$?,允许进一步处理。
隐式:
对于每个语句,在你的脑海中,将单词"succeeds"添加到命令中,然后在它们周围添加if、until或while结构,直到短语有意义为止。
直到nc成功为止;做...;完成
* Bash手册:直到...做...循环
使用-z选项将阻止nc从stdin读取数据,因此无需使用< /dev/null重定向。

1
很好,您可以在重试时看到命令输出消息。 - Nik

20

你可以尝试类似于这样的方法

while true; do
    nc 127.0.0.1 25565 < /dev/null
    if [ $? -eq 0 ]; then
        break
    fi
    sleep 1
done
echo "The command output changed!"

1

我个人更喜欢 @Lee Duhem 的解决方案,尽管我认为我有更好的执行方式。

这将一直运行,直到成功退出:

while true; do
nc 127.0.0.1 25565 < /dev/null && break
done

这将一直运行,直到它退出失败:

while true; do
nc 127.0.0.1 25565 < /dev/null || break
done

第一个的一行等效代码:

while true; do nc 127.0.0.1 25565 < /dev/null && break; done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接