为什么人们在sh中增加或减少变量之前添加“true”?

  • 本文关键字:变量 添加 true 增加 sh shell
  • 更新时间 :
  • 英文 :


我有一个脚本,其中包含一个while循环内的true $(( var-- ))语句这是什么意思?它可以是不带"true"的$(( var-- ))。但为什么要这样呢?true在这里的意义是什么?

补充λ用户的有用答案:

true $(( var-- ))中的true一种执行变量赋值而不引起(额外的)副作用的方法:

  • 算术展开——$(( ... )) ——展开为(被替换为)计算/赋值的结果
  • 使用算术展开作为独立语句导致shell将其结果解释为执行的命令,作为用户λ用户注释-这通常是不希望的。
  • 通过将算术展开作为参数传递给true,其结果将被有效地忽略,因为true忽略了您传递给它的任何参数。
然而:

  • --++不兼容posix,如λ用户指出。
  • 应用扩展但忽略所有参数技巧的首选方法是使用:而不是true;:是null实用程序,其明确目的是展开,但忽略其参数,同时始终将退出代码设置为0
因此,要保持 posix兼容[1](当在以/bin/sh为目标的脚本中使用时),您应该使用:
: $(( var-=1 ))

然而,如果您可以假设 bash ksh zsh ,您可以使用--,也可以简单地省略$来获得算术计算,使展开为任何

:
(( var-- ))  

或者,为了确保退出码0(退出码通常在循环的中不重要):

: (( var-- ))

请注意,如果计算结果为0, (( ... ))将其退出码设置为1,对于任何非零结果设置为0,这允许在条件(if (( ... )); then ...)中直接使用,作为[ ... ]/[[ ... ]]条件的算术/布尔替代。


[1]请注意,POSIX确实允许--甚至(( ... )),但只是作为可选扩展,所以您不能假设它们在所有平台上都存在。

$var--在正常shell中不递减。要做数学运算,必须用$(())把它括起来(顺便说一句,--不是在常规的POSIX shell中)。

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

期望true命令存在并丢弃其参数

最新更新