我有一个脚本,其中包含一个while循环内的true $(( var-- ))
语句这是什么意思?它可以是不带"true"的$(( var-- ))
。但为什么要这样呢?true在这里的意义是什么?
补充λ用户的有用答案:
true $(( var-- ))
中的true
是一种执行变量赋值而不引起(额外的)副作用的方法:
-
算术展开——
$(( ... ))
——展开为(被替换为)计算/赋值的结果。 - 使用算术展开作为独立语句导致shell将其结果解释为执行的命令,作为用户λ用户注释-这通常是不希望的。
-
通过将算术展开作为参数传递给
true
,其结果将被有效地忽略,因为true
忽略了您传递给它的任何参数。
-
--
和++
不兼容posix,如λ用户指出。 - 应用扩展但忽略所有参数技巧的首选方法是使用
:
而不是true
;:
是null实用程序,其明确目的是展开,但忽略其参数,同时始终将退出代码设置为0
。
/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
命令存在并丢弃其参数