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。


如何最好地使用算术评估检查变量是否为零?

4

2 回答 2

4

测试 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。

于 2013-03-24T23:11:47.870 回答
3

“翻转”任何不成功的值的含义的一个很好的理由0,您可能想要指示不同的错误条件。 0

0其用作失败根本不可能,因为任何值 !=0都会被浪费以表示成功。

给定一个数字变量,检查该值是否0完全正确的最佳方法是:

((v==0))
于 2013-03-24T23:16:28.403 回答