使用vs不使用测试时bash表达式的评估顺序

时间:2018-09-17 07:12:36

标签: bash

在使用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}}

2 个答案:

答案 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" 

请参见The classic test command