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

Bash if - Exit code shows 0 when it shouldn't?

我在任何地方都找不到这个问题 - 如果重复,请告诉我。

我想弄清楚为什么 退出代码 ($?) 在这个 Bash if 语句中是 0,而 254.254.254.254 显然不是存在:

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

Yes - 0

在对 if [[ ` ` ]] 进行了一些试验之后,如果 stdout 上有任何输出,无论是否需要输出,是否出现错误,它看起来都在评估 true退货与否。我原以为测试退出代码 $? 会缓解这个问题,但显然不是?

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

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

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

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

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

if ping -c 1 254.254.254.254; then