If块在Bash中总是转到else
下面的代码段在应该进入If块在Bash中总是转到else,bash,Bash,下面的代码段在应该进入elif时进入else语句 #The following line returns 3, 4 or 5 as the exit code. $BASH_EXEC adbE.sh "adb $ARGUMENT install $f" echo "the return code:$?." if [ $? -eq 5 ] then #do nothing, success continue elif [ $? -eq 4 ]
elif
时进入else
语句
#The following line returns 3, 4 or 5 as the exit code.
$BASH_EXEC adbE.sh "adb $ARGUMENT install $f"
echo "the return code:$?."
if [ $? -eq 5 ]
then
#do nothing, success
continue
elif [ $? -eq 4 ]
then
echo "WARNING"
else
echo "ERROR"
break
fi
此部分:echo“返回代码:$?”
将其返回到屏幕:返回代码:4。
并且它不显示警告
。它只显示ERROR
,然后断开包含此代码的循环
我做错了什么
以下是我尝试过的导致相同问题的条件比较的变化:
if[$?-eq 5]
if[$?-eq“5”]
如果[$?==5]
如果[$?=“5”]
if[[$?-eq 5]]
if[[$?-eq“5”]
if[[$?=“5”]
如果[[$?==5]]
原因是$?
是上次执行的命令的返回代码。您正在运行echo
命令,然后执行if
,因此您要测试的是echo
的返回码,返回码总是0
此外,在您的情况下,由于您正在重新测试elif
语句中的返回值,因此还存在一个额外的问题。初始测试(即[$?-eq 5]
)也将更改$?
的值,因此重新测试将产生意外结果
要解决此问题,请在执行echo
之前保存以前的返回代码,然后将保存的版本用于将来的所有测试:
ret=$?
echo "the return code:${ret}."
if [ ${ret} -eq 5 ]
then
#do nothing, success
continue
elif [ ${ret} -eq 4 ]
then
echo "WARNING"
else
echo "ERROR"
break
fi
我取出了echo“返回代码:$?”
,if块之前的唯一命令是我希望从中返回的命令。但还是失败了。然而,我使用了您提到的变量赋值方法,它起了作用。为什么删除echo“返回代码:$?”
无法解决此问题?只要删除echo“返回代码:$?”
就可以了,因为返回值是4
。谢谢你说得对,移除回声应该能解决问题。但由于您在此之前没有发布任何代码,我无法解释为什么没有发布:-/Ah!我想我可能已经破解了。。。测试本身正在创建一个新的返回值。调用test
命令(即[$?-eq 5]
)时,其主要功能是提供返回值。因此,您不能在elif
语句中再次测试$?
。您能在原始答案中发布这部分答案吗?这样人们就可以看到真正的原因是什么,而不必阅读评论。谢谢是的。我改变了我原来的答案,把我们在这里发现的东西包括进去。