为什么未设置的变量在 bash if 语句中被评估为 0

Why an unset variable gets evaluated as 0 in bash if statement

我想了解为什么未设置的变量被评估为 0。 在一些我写的脚本中,只有在需要时才会设置变量,有时则不会。 所以这种行为会导致输出不正确。 这是否意味着我必须预设所有变量或至少添加检查它们是否已设置?

#!/bin/bash
#myvalue=0  #comment to simulate an unset variable.

if [[ $myvalue -eq 0 ]] ; then
   echo "OK"
fi

成功的结果:

bash -x test.sh
+ [[ '' -eq 0 ]]
+ echo OK
OK

[[ ... ]] 中的 -eq 运算符,因为它只适用于整数值,所以会触发对其操作数的算术计算。在算术表达式中,unset 变量默认为 0。更明显的算术评估演示:

$ if [[ 3 -eq "1 + 2" ]]; then echo equal; fi
equal

请注意,在您的示例中,您甚至不需要先扩展参数;算术评估将为您完成:

$ if [[ myvalue -eq 0 ]]; then echo equal; fi
equal
$ myvalue=3
$ if [[ myvalue -eq 3 ]]; then echo equal; fi
equal

此外,这是特定于 bash [[ ... ]] 命令的。对于 POSIX [-eq 不会触发算术计算。

$ if [ "$myvalue" -eq 0 ]; then echo equal; fi
bash: [: : integer expression expected
$ if [ myvalue -eq 0 ]; then echo equal; fi
bash: [: myvalue: integer expression expected

如果您希望文字值作为比较,请使用 = 而不是 -eq

if [[ $myvalue = 0 ]] ; then
    echo "OK"
fi

算术二元运算符(-eq) returns 如果arg1等于0则为真,也就是$myvalue,是否设置为0或根本没有设置... '' 为空,等于零。