【问题标题】:Order of evaluation of bash expression when using vs not using test使用与不使用测试时 bash 表达式的评估顺序
【发布时间】:2018-09-17 07:12:35
【问题描述】:

为什么在使用test 和不使用test 评估相同的表达式时,以下脚本会给出不同的输出?要考虑哪些规则:运算符优先级、从左到右或从右到左的参数评估......?在我看来,在这个基础层面理解 bash 的逻辑很重要。

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】:

    那是因为

    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

    【讨论】:

      【解决方案2】:

      在这种情况下,您对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

      【讨论】:

      • 在我的示例中,为什么 test 评估“a || b”,而不是“a”或“a || b && c”?
      • 我猜只要遇到||,表达式a || b 就会被test 计算,然后用c&& 运算符计算结果。跨度>
      • 这对我来说似乎是一种奇怪的行为。也许其他人可以在这里猜测一下?
      • OK,test 只评估 a 的输出(a 的输出被 test 吃掉了),这是真的,所以 b 评估被跳过(因为 ||),然后 c 被评估(因为 && ),并且它的输出没有被吃掉,所以它被发送到控制台。
      猜你喜欢
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多