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
我在任何地方都找不到这个问题 - 如果重复,请告诉我。
我想弄清楚为什么 退出代码 ($?) 在这个 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