为什么人们在递增或递减sh中的变量之前添加`true`?

时间:2016-10-03 12:16:10

标签: shell

我有一个脚本,在while循环中包含true $(( var-- ))语句,这是什么意思?它可能只是$(( var-- ))没有“ true ”。但为什么这样呢? true 的重要性在哪?

2 个答案:

答案 0 :(得分:4)

补充λuser's helpful answer

true中的true $(( var-- )) 是一种执行变量分配而不会造成(额外)副作用的方法

  • 算术扩展 - $(( ... )) - 扩展为(替换为)计算/赋值的结果
  • 将算术扩展用作独立语句会导致shell将其结果解释为命令以执行作为用户λuser注意 - 这通常是不受欢迎的。
  • 通过将算术扩展作为参数传递给true,其结果实际上是忽略 ,因为{{1}忽略你传递给它的任何参数。

然而:

  • true--不符合POSIX标准,正如λuser所指出的那样。
  • 应用expand-but-ignore-all-arguments技巧的首选方法是使用++而不是:; truenull utility,其明确目的是扩展,但忽略其参数,同时始终将退出代码设置为:

因此,要保持 POSIX兼容 [1] (在用于定位0的脚本中时),您应该使用:

/bin/sh

但是,如果您可以假设 : $(( var-=1 )) bash {{1} } ,您可以使用ksh,也可以省略zsh以获得扩展到任何内容的算术评估

--

或者,要确保退出代码$(退出代码通常在循环的正文中无关紧要):

(( var-- ))  

请注意,如果计算结果为0,则: (( var-- )) 会将其退出代码设置为(( ... )),而对于任何非零结果,1会将退出代码设置为0,这样就可以直接在条件数中使用( 0),作为if (( ... )); then ... / [ ... ]条件的算术/布尔替代。

[1]请注意,POSIX允许[[ ... ]]甚至--,但仅限可选扩展,因此您不能假设它们存在于所有平台上

答案 1 :(得分:3)

$var--在正常shell中不会减少。 要进行数学运算,必须enclose it with $(())(并且btw --不在常规POSIX shell中。)

但是,这是一个表达式,因此,在计算之后,它返回一个输出(表达式的结果),然后在命令的上下文中进行解释。如果您的行只包含$((var--)),它会尝试将结果作为命令进行评估,例如好像你的行只包含数字42. shell可能会抱怨它找不到名为42的命令。

预计true命令存在并丢弃其参数。