我有以下命令行,它应该返回值1
,通过nc
检查与相关 IP 和端口的通信:
/bin/nc -z 10.102.10.22 10003 > /dev/null && if [ $? -eq 0 ]; then echo 1; else echo 0; fi
结果令人满意,我得到了价值1
。但是,当没有与端口或 IP 进行通信时,该命令将处于“等待”状态,而不会获得任何类型的值。
经过特定时间(例如 10 秒)后返回值0
(语句)的正确方法是什么。else
每隔很短的时间就会监视该命令的结果以绘制通信图,因此知道它是什么时候是很有趣的0
。
答案1
您似乎只有在成功完成时才运行该if
语句:nc
nc ... && if ...
这解释了为什么0
从不输出。由于失败时该if
语句不被执行nc
,因此else
该语句的分支if
始终不可达。
相反,nc
直接使用if
:
if nc -z 10.102.10.22 10003 >/dev/null; then
echo 1
else
echo 0
fi
您可能还可以使用短路逻辑编写此特定语句:
nc -z 10.102.10.22 10003 >/dev/null && echo 1 || echo 0
...但从技术上讲,它与声明不同if
。echo 0
如果满足以下条件,则执行最后一条命令:任一 nc
或echo 1
失败。
要让nc
命令在 10 秒后退出,请使用 GNU 实用程序timeout
:
if timeout 10 nc -z 10.102.10.22 10003 >/dev/null; then
echo 1
else
echo 0
fi
特殊变量$?
是很少使用。仅当您需要在执行一个或多个其他命令之后使用某个命令的退出状态时才需要它。例如,在某些情况下从 shell 函数返回退出状态时:
myfunction () {
grep -q 'pattern' file
err=$?
if [ "$err" -ne 0 ]; then
echo failed >&2
fi
return "$err"
}
在这里,[ ... ]
测试和echo
重置$?
。
答案2
仅&&
当第一部分为真时才应用第二部分。所以你拥有的是这个
nc
成功了,所以运行if it suceeded
(它确实做到了)echo 1
nc
失败,所以不要超越&&
我想你想要的是这个
if nc -z 10.102.10.22 10003 > /dev/null; then echo 1; else echo 0; fi
答案3
除了其他优秀的答案之外,您想要的结果也是退出状态的算术否定:
nc -z 10.102.10.22 10003 > /dev/null
echo $(( ! $? ))