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

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

我有以下命令行,它应该返回值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

...但从技术上讲,它与声明不同ifecho 0如果满足以下条件,则执行最后一条命令:任一 ncecho 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 $(( ! $? ))

相关内容