在使用test
和不使用function a()
{
local r=1
printf "a%d" $r
return $r
}
function b()
{
local r=1
printf "b%d" $r
return $r
}
function c()
{
local r=1
printf "c%d" $r
return $r
}
printf "$BASH_VERSION\n" #outputs 4.3.48(1)-release
a || b && c #outputs a1b1
printf "\n"
test a || b && c #outputs c1
printf "\n"
的情况下计算相同的表达式时,为什么以下脚本会给出不同的输出?应考虑哪些规则:运算符优先级,从左至右或从右至左的参数求值...?我认为重要的是要在此基础上理解bash的逻辑。
{{1}}
答案 0 :(得分:1)
那是因为
a
运行a
,而
test a
运行test
,并将a
作为参数传递。它们是完全不同的命令。
类似地,
pwd
运行pwd
,但是
echo pwd
运行echo
,并将pwd
作为参数传递。
X || Y
不是表达式,它是一个复合命令,该命令首先运行X
子命令,然后(如果其退出状态为非零)运行Y
。
有关详细信息,请参见https://www.gnu.org/software/bash/manual/bashref.html#Lists。
答案 1 :(得分:1)
在这种情况下,您对test
的使用是不正确的。 test
通过对表达式求值,将返回代码设置到调用shell。 test a
的使用方式不会评估表达式,但最终会将代码设置为test 1
,该代码会进行字符串检查并始终声明代码0(成功错误代码)。见
test 0; echo $?
0
test 1; echo $?
0
test false; echo $?
0
test true; echo $?
0
test
对表达式a||b
求值,该表达式将返回代码1
设置为test
,返回成功错误代码并运行函数c
您所看到的值。
为简单起见,我将函数调用更改为使用命令false
,该命令将错误代码1
返回到shell作为函数。
bash -cx "test false || false && echo hi"
+ test false
+ echo hi
hi
如您所见,在运行test false|| false
的那一刻,该命令将成功代码设置到shell,并使用操作数&&
来运行echo
命令。
要检查功能中的错误代码,也许您应该检查为
test a != "0"