在 POSIX Shell 中前/后递增变量时,这两个示例之间有什么区别。它们看起来会产生相同的后果,但它们的使用方式会有所不同吗?您什么时候更喜欢其中一种而不是另一种?
X=$((X+1))
: $((X=X+1))
答案1
在第一个示例中,$((X+1))
计算表达式 X + 1 并扩展为结果,然后将其分配给变量。
在第二个示例中,$((X=X+1))
递增X
1($((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
这具有所需的副作用,节省一行,而且非常清晰。