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

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

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

Netcat检查端口是否打开,如果打开则返回0,如果closures则返回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!" 

我在这里做错了什么?

你可以尝试类似的东西

 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!" 

把事情简单化

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

只要让shell隐式地处理退出状态

shell可以以两种方式处理退出状态(记录在$? ):显式和隐式。

显式: status=$? ,这允许进一步处理。

隐式:

对于每一个陈述,在你的脑海里,把“成功”这个词加到这个命令中,然后加上ifuntilwhile构成它们,直到这个短语变得有意义。

until nc 成功 ; do ...; done ; do ...; done


-z选项将停止读取stdin的nc ,所以不需要< /dev/null重定向。