我在本地机器上安装了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=$?
,这允许进一步处理。
隐式:
对于每一个陈述,在你的脑海里,把“成功”这个词加到这个命令中,然后加上if
, until
或while
构成它们,直到这个短语变得有意义。
until nc
成功 ; do ...; done
; do ...; done
-z
选项将停止读取stdin的nc
,所以不需要< /dev/null
重定向。