IF语句中函数的返回值显示奇怪的行为

时间:2014-04-13 14:05:52

标签: bash

有谁能解释这里发生了什么?

为什么当我说“返回0”时,“IF”语句认为返回为“1”(不是空),反之亦然。

我在编写另一个脚本时发现了这一点,所以我开发了这个小脚本来测试它:

#!/bin/bash

function testreturnzero()
{
        echo $1
        return 0
}


function testreturnone()
{
        echo $1
        return 1
}


if (testreturnzero 1) || (testreturnzero 2)
then
        echo "zero returned '1'"
fi


if (testreturnone 1) || (testreturnone 2)
then
        echo "one returned '1'"
fi

引用'返回0'的IF认为它是真的(并且不处理第二个函数),引用'返回1'的IF认为它是假的。难道不应该恰恰相反吗?

1
zero returned '1'
1
2

我无法将返回值放在变量中,因为我将进行多次检查。

2 个答案:

答案 0 :(得分:2)

bash中,当您test结果时,函数的返回码与外部程序相同。

因此对于test,有效的返回代码为0,无效为任何其他数字

所以,通过做

if ( testreturnone 1 ); then #it is ok
   echo "error"; #it's supposed to happen, not an error
fi

您可以明确地测试要清除它的值:

if [[ "$(testreturnzero 1)" = "1"); then #it is ok if you decide that 1 is the good value
   echo "ok";                            #But absolutly not the bash philosophy
fi

答案 1 :(得分:2)

在bash中,返回0的函数表示success,返回非零值表示failure。因此,testreturnzero成功,testreturnone失败。

这有助于了解您的if行为的原因吗? (它应该!)。

最后执行的命令/函数的返回码存储在特殊变量$?中。

所以:

testreturnzero 0
ret_testreturnzero=$?
testreturnone 1
ret_testreturnone=$?
echo "$ret_testreturnzero"
echo "$ret_testreturnone"

将输出(最后两行):

0
1

现在您可以考虑将它们存储在变量中(如此处)并稍后进行逻辑处理。但是有一个问题:)。由于您没有在变量中存储truefalse,因此您存储了01(bash无法将布尔值存储在变量中)。所以稍后检查成功或失败:

if ((ret_testreturnzero==0)); then
    echo "testreturnzero succeeded"
fi

if ((ret_testreturnzero!=0)); then
    echo "testreturnzero failed"
fi