我的本地计算机上安装了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!"
我在这里做错了什么?
答案 0 :(得分:35)
保持简单
until nc -z 127.0.0.1 25565
do
echo ...
sleep 1
done
让shell隐式处理退出状态
shell可以通过两种方式处理退出状态(记录在$?
中),显式和隐式。
明确:status=$?
,允许进一步处理。
隐式:
对于每个语句,在您的脑海中,在命令中添加“成功”一词,然后添加
if
,until
或while
围绕它们构建,直到这句话有意义。
until nc
成功 ; do ...; done
-z
选项会阻止nc
读取标准输入,因此无需< /dev/null
重定向。
答案 1 :(得分: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!"