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


17

在POSIX Shell中,在变量前后进行递增时,这两个示例之间有什么区别。他们似乎会产生相同的结果,但是使用方式会有所不同吗?您何时会选择一个?

X=$((X+1))

: $((X=X+1))

Answers:


18

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

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

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

  • null命令是晦涩难懂且容易被误解的地方,正如它通常是此处令人困惑的问题所表明的那样。
  • 就外壳语言的整体语法而言,第一种形式似乎更自然,甚至有点像旧的评估风格。
  • 第一种形式更清楚,更简洁,并且不涉及命令。

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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.