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

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

在 POSIX Shell 中前/后递增变量时,这两个示例之间有什么区别。它们看起来会产生相同的后果,但它们的使用方式会有所不同吗?您什么时候更喜欢其中一种而不是另一种?

X=$((X+1))

: $((X=X+1))

答案1

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

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

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

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

如果您只修改一个命令的环境,例如

X=$((X+1)) /usr/local/bin/something

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

ls -la "file-$((X++))"   # or ...
ls -la "file-$((X=X+1))" # for better compatibility

这具有所需的副作用,节省一行,而且非常清晰。

相关内容