我注意到bash的(( ))
符号返回状态存在一些表面上的不一致性。
考虑以下示例:
$> A=0
$> ((A=A+1))
$> echo $? $A
0 1
然而,使用另一种众所周知的简写增量符号会产生以下结果:
$> A=0
$> ((A++))
$> echo $? $A
1 1
如果脚本中有内置的set -e
,则第二种表达式会导致脚本退出,因为((A++))
的退出状态返回了非零值。类似问题在这个相关问题中已经得到解答。但它似乎没有解释两种表达式((A=A+1))
和((A++))
之间的退出状态差异。
((A++))
似乎仅在A
等于0
时返回1
。(免责声明:我没有进行全面的测试。在bash 4.1.2和4.2.25中进行了测试)。因此,最终问题可以归结为:
为什么A=0; ((A++))
返回1
?
set -e
时,如果期望计数器可能取值为-1
或0
,就无法安全地使用缩写符号。 是否有方法可以解决这个问题?还是应该放弃缩写符号? - Pankratesset -e
。请参阅 http://mywiki.wooledge.org/BashFAQ/105。话虽如此,您也可以运行(( a++ )) ||:
。 - Charles Duffyset -e
(我想这是方便),但前提是有一个详尽的陷阱列表。由于我没有这样的列表(如果真的存在这样的列表),我想我会听从你的建议 :) - Pankrates