在bash脚本中评估test
或[
表达式的顺序是什么?它和它们的编写顺序是一样的吗?它们都被评估了吗?
在以下示例中:
if [ expr1 -a -n expr2 ]
如果 expr1 为false,expr2 会被评估吗?
答案 0 :(得分:11)
自从我使用这种特殊语法以来已经有很长一段时间了。如今,我更喜欢:
if [[ expr1 && -n expr2 ]]
因为我知道这些是短路的。 bash
手册页明确指出:
如果expression1的值足以确定整个条件表达式的返回值,则
&&
和||
运算符不会计算expression2。
[
和test
变体(使用-a
)似乎没有明确说明这种或那种方式。
然而,为了进一步提升你的知识和我的知识(并指出为什么开源是一件好事),我去了bash
源代码。
事实证明,在那种情况下 没有短路。特定的代码片段(为了便于阅读而压缩了一点):
static int or() {
int value, v2;
value = and();
if (pos < argc && argv[pos][0] == '-'
&& argv[pos][1] == 'o' && !argv[pos][2])
{
advance (0);
v2 = or();
return (value || v2);
}
return (value);
}
static int and() {
int value, v2;
value = term();
if (pos < argc && argv[pos][0] == '-'
&& argv[pos][1] == 'a' && !argv[pos][2])
{
advance (0);
v2 = and();
return (value && v2);
}
return (value);
}
您可以在这两种情况下看到,无论第一个表达式的状态如何,它都会继续解释表达式。
那是来自bash
2.5,但我刚刚检查了4.1来源并且没有改变。来源是从horse's mouth直接拉出来的。
因此。底线:使用-a
和-o
与test
或[
时,似乎会评估所有子表达式。