为什么`((0))`在.sh脚本中的返回值为1?

时间:2017-03-16 21:26:02

标签: bash shell sh

> [ 0 ]; echo $?
0
> [[ 0 ]]; echo $?
0
> (( 0 )); echo $?
1
> [ 1 ]; echo $?
0
> [[ 1 ]]; echo $?
0
> (( 1 )); echo $?
0

(( 0 ))的行为是否与其他语言中的典型数值false匹配? IE在哪里true == 1false == 0

2 个答案:

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

但是在这种情况下,[[命令会因bashksh而失败:

$ bash
$ [[ ]]; echo $?
bash: syntax error near ';'
$ ksh
$ [[ ]]; echo $?
ksh: syntax error: `;' unexpected