我有一个脚本,在while循环中包含true $(( var-- ))
语句,这是什么意思?它可能只是$(( var-- ))
没有“ true ”。但为什么这样呢? true 的重要性在哪?
答案 0 :(得分:4)
true
中的true $(( var-- ))
是一种执行变量分配而不会造成(额外)副作用的方法:
$(( ... ))
- 扩展为(替换为)计算/赋值的结果。 true
,其结果实际上是忽略 ,因为{{1}忽略你传递给它的任何参数。然而:
true
和--
不符合POSIX标准,正如λuser所指出的那样。++
而不是:
; true
是null 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
命令存在并丢弃其参数。