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

Tom*_*Tom 3 bash

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

在以下示例中:

if [ expr1 -a -n expr2 ]
Run Code Online (Sandbox Code Playgroud)

EXPR2如果被评估表达式1是假的?

pax*_*blo 11

自从我使用那个特定的语法以来已经有很长一段时间了.如今,我更喜欢:

if [[ expr1 && -n expr2 ]]
Run Code Online (Sandbox Code Playgroud)

因为我知道这些都是短路的.该bash手册页明确指出:

&&||如果表达式的值是足以决定整个条件表达式的返回值运营商不计算表达式2.

对于[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);
}
Run Code Online (Sandbox Code Playgroud)

无论第一个表达式的状态如何,您都可以在这两种情况下看到它继续解释表达式.

这是bash2.5,但我刚刚检查了4.1源,但没有改变.来源是从马的嘴里直接拉出来的.

所以.底线:似乎所有的子表达式是使用时评估-a-otest[.