几个与算术相关的命令,Dash、POSIX shell、sh、Increment

J. *_*ker 20 shell dash shell-script posix

在 POSIX Shell 中对变量进行 pre/post 递增时,这两个示例之间有什么区别。它们看起来会产生相同的结果,但它们的使用方式会不同吗?你什么时候更喜欢一个?

X=$((X+1))

: $((X=X+1))
Run Code Online (Sandbox Code Playgroud)

Ale*_*ios 23

在您的第一个示例中,$((X+1))计算表达式 X + 1 并扩展为结果,然后将其分配给变量。

在第二个示例中,$((X=X+1))递增X1($((X++))也是有效且更短的,但不一定受 shell 支持),然后扩展为 的新值$X,这是 null 命令的第一个参数:。null 命令忽略它的参数,结果被丢弃(有副作用)。

由于三个(相对主观的)原因,我个人更喜欢第一种形式:

  • null 命令晦涩难懂且容易被误解,正如它在这里经常成为混淆问题的主题所表明的那样。
  • 第一种形式在整体 shell 语法方面似乎更自然,甚至有点类似于旧的评估风格。
  • 第一种形式更清晰简洁,不涉及命令。

如果您只修改一个命令的环境,则必须使用第一个版本,例如

X=$((X+1)) /usr/local/bin/something
Run Code Online (Sandbox Code Playgroud)

您必须使用第二种形式直接向参数添加评估:

ls -la "file-$((X++))"   # or ...
ls -la "file-$((X=X+1))" # for better compatibility
Run Code Online (Sandbox Code Playgroud)

这具有所需的副作用,节省了一行,并且非常清楚。