【问题标题】:Different result from $((++n)) when running bash vs dash运行 bash vs dash 时与 $((++n)) 的结果不同
【发布时间】:2019-02-28 01:31:48
【问题描述】:

在 bash 和 dash 中运行程序时,我得到不同的输出

#!/bin/sh

echo $SHELL
n=1
a=$((++n))
echo $n

重击:

$ bash shell_test.sh
2

破折号:

$ dash shell_test.sh
1

【问题讨论】:

    标签: bash shell dash-shell


    【解决方案1】:

    dashDebian Almquist shell 和完全符合 POSIX 标准的 /bin/sh 外壳实现的极轻量级版本,旨在尽可能小,从而加快启动时间.

    $((n++))$((--n)) 等运算符是 POSIX 不需要的功能,因此未实现。

    要了解 dash 如何解释这些语句,请参阅 Chepner's answer

    here 是一个很好的页面,它解释了如何使您的脚本符合 POSIX 标准。


    2.6.4 算术展开: 算术展开提供了一种评估算术表达式并代入其值的机制。算术展开的格式如下:

    $((expression))
    

    表达式应被视为双引号,除非表达式内的双引号没有被特殊处理。 Shell 应扩展表达式中的所有标记,以进行参数扩展、命令替换和引号删除。

    接下来,shell 应将其视为算术表达式并替换表达式的值。算术表达式应按照Arithmetic Precision and Operations中给出的规则进行处理,以下情况除外:

    • 只需要有符号长整数运算。
    • 只有 ISO C 标准第 6.4.4.1 节中指定的十进制常量、八进制常量和十六进制常量才需要被识别为常量。
    • sizeof() 运算符和 前缀和后缀 ++-- 运算符不是必需的。
    • 不支持选择、迭代和跳转语句。

    来源:POSIX IEEE Std 1003.1-2017

    【讨论】:

      【解决方案2】:

      POSIX 不需要前缀++,并且dash 没有实现它。相反,它被解析为两个一元 + 运算符:

      $ n=1
      $ echo $((+(+n)))
      1
      $ echo $((++n))
      1
      $ echo $n
      1
      

      【讨论】:

        猜你喜欢
        • 2014-06-29
        • 1970-01-01
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        • 2017-10-13
        • 2013-09-25
        • 2012-06-21
        • 2020-06-14
        相关资源
        最近更新 更多