带有在 else 中不响应的命令的条件“if”

bal*_*lon 0 shell bash nc

我有以下命令行,它应该返回值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 秒)后返回值0else语句)的正确方法是什么。

该命令的结果每隔很短的时间就会被监视以绘制通信图,因此知道什么时候会很有趣0

Kus*_*nda 6

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,如果任一 ncecho 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 和echoresets $?


roa*_*ima 5

&&当第一部分为真时才应用第二部分。所以你拥有的是这个

  • 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)