我发现这种行为违反直觉:
v=0; ((v)) && echo K; v=1; ((v)) && echo J
回波:
J
但通常0
成功:
f() { return 0; }; if f; then echo W; fi
man
的{p> (( ))
页说:
如果表达式的值非零,则返回状态为0;否则返回状态为1.
如何使用算术评估最好地检查变量是否为零?
答案 0 :(得分:4)
测试0的规范方法是[ $something -eq 0 ]
,通常写为[ x$something = x0 ]
。 (使用=
是一个字符串比较,但是当未设置变量或空白时,它仍然是有效的语法。)请参阅man expr
。
所以,
q=0
if [ $q -eq 0 ]; then # or [ x$q = x0 ]
echo yes, zero
fi
((expr))
语法是let
命令的快捷方式,该命令只是定义为在表达式非零时返回true
状态,否则返回false。
((...))
和let ...
都不是Posix命令,因此可能需要一些 WTF?!。这只是bash的作者想到或从一些现在模糊不清的早期shell中提取出来的东西。 (它似乎是在zsh中。)它不在ash(1), aka dash(1),中,它是一种参考纯-Posix shell。
答案 1 :(得分:3)
将“意图”翻转为0
成功的一个很好的理由 0
未成功的是你可能想要指出不同的错误条件。
使用0
作为失败,这根本不可能,因为任何值!= 0
都会被浪费以表示成功。
给定一个数字变量,检查值是否为0
的最佳方法是做到这一点:
((v==0))