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