运行bash vs dash时$((++ n))的结果不同

use*_*153 5 bash shell dash-shell

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

#!/bin/sh

echo $SHELL
n=1
a=$((++n))
echo $n
Run Code Online (Sandbox Code Playgroud)

击:

$ bash shell_test.sh
2
Run Code Online (Sandbox Code Playgroud)

短跑:

$ dash shell_test.sh
1
Run Code Online (Sandbox Code Playgroud)

kva*_*our 7

dashDebian Almquist shell,是一个完全符合POSIX标准的shell实现的极轻量级版本/bin/sh,旨在尽可能小地创建更快的启动时间.

运营商,如$((n++)),$((--n))和类似的是未由POSIX需要,因此没有实现的特征.

要了解破折号如何解释这些陈述,请参阅切普纳的答案

一个很好的页面解释如何使您的脚本POSIX兼容,就在这里.


2.6.4算术扩展: 算术扩展提供了一种机制,用于评估算术表达式并替换其值.算术扩展的格式如下:

$((expression))
Run Code Online (Sandbox Code Playgroud)

该表达式应被视为双引号,但表达式中的双引号未被特别处理.shell应扩展表达式中的所有标记,以便参数扩展,命令替换和引用删除.

接下来,shell应将其视为算术表达式并替换表达式的值.算术表达式应根据算术精度和操作中给出的规则进行处理,但以下情况除外:

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

来源:POSIX IEEE Std 1003.1-2017


che*_*ner 6

++POSIX不需要前缀,dash也不实现它.相反,它被解析为两个一元运算+符:

$ n=1
$ echo $((+(+n)))
1
$ echo $((++n))
1
$ echo $n
1
Run Code Online (Sandbox Code Playgroud)