bash算术表达式:检查零值变量

时间:2013-03-24 23:03:41

标签: bash

我发现这种行为违反直觉:

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.


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

2 个答案:

答案 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))