我有以下命令行,它应该返回值1
,以防万一,通过nc
检查与相关 IP 和端口的通信:
/bin/nc -z 10.102.10.22 10003 > /dev/null && if [ $? -eq 0 ]; then echo 1; else echo 0; fi
Run Code Online (Sandbox Code Playgroud)
结果令人满意,我得到了价值1
。但是当没有与端口或 IP 通信时,命令会“等待”,不会获得任何形式的价值。
在经过特定时间(例如 10 秒)后返回值0
(else
语句)的正确方法是什么。
该命令的结果每隔很短的时间就会被监视以绘制通信图,因此知道什么时候会很有趣0
。
if
如果nc
成功完成,您似乎只运行该语句:
nc ... && if ...
Run Code Online (Sandbox Code Playgroud)
这解释了为什么0
从不输出。由于if
语句在nc
失败时不执行else
,所以if
语句的分支总是不可达的。
相反,nc
直接使用if
:
nc ... && if ...
Run Code Online (Sandbox Code Playgroud)
您也可以使用短路逻辑编写此特定语句:
if nc -z 10.102.10.22 10003 >/dev/null; then
echo 1
else
echo 0
fi
Run Code Online (Sandbox Code Playgroud)
...但从技术上讲,这与if
声明不同。这最后的命令将执行echo 0
,如果任一 nc
或echo 1
失败。
要让nc
命令在 10 秒后退出,请使用 GNU 实用程序timeout
:
nc -z 10.102.10.22 10003 >/dev/null && echo 1 || echo 0
Run Code Online (Sandbox Code Playgroud)
特殊的变量$?
是很少使用。只有在需要在一个或多个其他命令执行之后使用某个命令的退出状态的情况下才需要它。例如,在某些情况下从 shell 函数返回退出状态时:
if timeout 10 nc -z 10.102.10.22 10003 >/dev/null; then
echo 1
else
echo 0
fi
Run Code Online (Sandbox Code Playgroud)
在这里,[ ... ]
test 和echo
resets $?
。
仅&&
当第一部分为真时才应用第二部分。所以你拥有的是这个
nc
成功了,所以运行if it suceeded
(它确实做到了)echo 1
nc
失败,所以不要超越&&
我想你想要的是这个
if nc -z 10.102.10.22 10003 > /dev/null; then echo 1; else echo 0; fi
Run Code Online (Sandbox Code Playgroud)