【发布时间】: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
在 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
dash 是 Debian 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 不需要前缀++,并且dash 没有实现它。相反,它被解析为两个一元 + 运算符:
$ n=1
$ echo $((+(+n)))
1
$ echo $((++n))
1
$ echo $n
1
【讨论】: