Bash if - 退出代码在不应该显示时显示0?

时间:2018-04-08 17:57:58

标签: bash if-statement exit-code

我无法在任何地方找到这个问题 - 请让我知道它是否重复。

我试图找出为什么退出代码($?)为0 在这个Bash if语句中,当254.254.254.254显然不存在时:

if [[ `ping -c 1 254.254.254.254` ]];then
  echo "Yes - $?"
else
  echo "No - $?"
fi

Yes - 0

在尝试if [[``]一点之后,如果stdout上有任何输出,无论是否需要输出,看起来它都会评估为真,是否返回错误。我认为测试退出代码$?可以缓解这个问题,但显然不是吗?

如果您运行ping -c 1 254.254.254.254;echo $?,您将获得正确的退出代码1。为什么不出现在我的if语句中?

1 个答案:

答案 0 :(得分:4)

您没有查看ping的退出代码;你正在检查它是否写了任何标准输出。你的代码相当于

if [[ -n $(ping -c 1 254.254.254.254) ]]; then

$?[[ ... ]]的退出代码(这就是为什么你首先进入“是”分支的原因)。

要检查退出代码,请不要捕获输出,也不要在[[ ... ]]命令中使用它。

if ping -c 1 254.254.254.254; then