bash if block每次都转到else

pro*_*007 2 bash

下面的代码段else应该进入语句elif.

    #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
Run Code Online (Sandbox Code Playgroud)

这部分:echo "the return code:$?."将此回显到屏幕:the return code:4.

并且它不显示WARNING.它只显示ERROR然后打破for包含此代码的循环.

我究竟做错了什么?


以下是我尝试过的条件比较的变化导致了同样的问题:

  1. if [ $? -eq 5 ]
  2. if [ $? -eq "5" ]
  3. if [ $? == 5 ]
  4. if [ $? == "5" ]
  5. if [[ $? -eq 5 ]]
  6. if [[ $? -eq "5" ]]
  7. if [[ $? == "5" ]]
  8. if [[ $? == 5 ]]

Lee*_*ton 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
Run Code Online (Sandbox Code Playgroud)

  • 啊! 我想我可能已经破解了......测试本身正在创造一个新的回报值.当你调用`test`命令(即`[$?-eq 5]`)时,它的主要功能是提供一个返回值.因此,你不能再在`elif`语句中测试`$?`. (2认同)