什么是bash“test”命令评估顺序?

时间:2010-07-06 07:05:18

标签: bash

在bash脚本中评估test[表达式的顺序是什么?它和它们的编写顺序是一样的吗?它们都被评估了吗?

在以下示例中:

if [ expr1 -a -n expr2 ]
如果 expr1 为false,

expr2 会被评估吗?

1 个答案:

答案 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-otest[时,似乎会评估所有子表达式。