> [ 0 ]; echo $?
0
> [[ 0 ]]; echo $?
0
> (( 0 )); echo $?
1
> [ 1 ]; echo $?
0
> [[ 1 ]]; echo $?
0
> (( 1 )); echo $?
0
(( 0 ))
的行为是否与其他语言中的典型数值false匹配? IE在哪里true == 1
和false == 0
?
答案 0 :(得分:7)
来自bash manual:
(( expression ))
算术表达式根据下面描述的规则进行评估(参见Shell算术)。如果表达式的值不为零,则返回状态为0
;否则返回状态为1
。
您的假设可能是正确的,它可以模仿许多编程语言将任何非零值视为真实的方式。然后你可以写:
if (( <expression> ))
then
...
fi
类似于你在C中的表现。
答案 1 :(得分:2)
Barmar已经为您的主要问题做出了正确的答复。
您的大部分测试都不是关于测试算术表达式值,而是与test
命令[
或ksh
/ bash
条件相关复合命令[[
。
在这种情况下,如果没有运算符,则测试是基于字符串的,而不是算术,并且规则非常简单,所有不是空字符串的计算结果为true,因此只有空字符串的计算结果为false。
这就是所有非算术测试返回成功状态(0)的原因:
$ [ 0 ]; echo $?
0
$ [[ 0 ]]; echo $?
0
$ [ 1 ]; echo $?
0
$ [[ 1 ]]; echo $?
0
获取失败状态(1):
$ [ "" ]; echo $?
1
$ [[ "" ]]; echo $?
1
test命令也不接受任何字符串:
$ [ ]; echo $?
1
但是在这种情况下,[[
命令会因bash
和ksh
而失败:
$ bash
$ [[ ]]; echo $?
bash: syntax error near ';'
$ ksh
$ [[ ]]; echo $?
ksh: syntax error: `;' unexpected