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

问题描述 投票:7回答:2

我在本地计算机上安装了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!"

我在这做错了什么?

linux bash loops netcat
2个回答
35
投票

把事情简单化

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

让shell隐式处理退出状态

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

明确:status=$?,允许进一步处理。

隐式:

对于每个语句,在您的脑海中,在命令中添加“成功”一词,然后在它们周围添加ifuntilwhile构造,直到该短语有意义。

until ncsucceeds; do ...; done


-z选项将阻止nc读取标准输入,因此不需要< /dev/null重定向。


4
投票

你可以试试像

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!"
© www.soinside.com 2019 - 2024. All rights reserved.