【问题标题】:Bash: Loop until command exit status equals 0Bash:循环直到命令退出状态等于0
【发布时间】:2014-03-25 18:52:42
【问题描述】:

我在本地机器上安装了一个 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!"

我在这里做错了什么?

【问题讨论】:

  • 你实际上并没有运行 nc 命令,它只是一个字符串。
  • 只是一个建议,但您是否尝试过在nc 127.0.0.1 25565 &lt; /dev/null; echo $? 周围使用反引号而不是双引号?

标签: linux bash loops netcat


【解决方案1】:

保持简单

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

让shell隐式处理退出状态

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

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

隐式:

对于每条语句,在你的脑海中,在命令中添加单词“succeeds”,然后添加 if、until 或 while 围绕它们构建,直到短语有意义。

until nc 成功; do ...; done


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

【讨论】:

    【解决方案2】:

    你可以试试

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

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 1970-01-01
      • 2013-02-10
      • 2011-07-08
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      相关资源
      最近更新 更多