有谁能解释这里发生了什么?
为什么当我说“返回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
我无法将返回值放在变量中,因为我将进行多次检查。
答案 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
现在您可以考虑将它们存储在变量中(如此处)并稍后进行逻辑处理。但是有一个问题:)
。由于您没有在变量中存储true
和false
,因此您存储了0
和1
(bash无法将布尔值存储在变量中)。所以稍后检查成功或失败:
if ((ret_testreturnzero==0)); then
echo "testreturnzero succeeded"
fi
或
if ((ret_testreturnzero!=0)); then
echo "testreturnzero failed"
fi