如果声明

时间:2017-06-12 14:09:04

标签: bash if-statement evaluation unset is-empty

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

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

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

结果OK:

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

2 个答案:

答案 0 :(得分:3)

-eq内的[[ ... ]]运算符,因为它仅适用于整数值,会触发其操作数的算术计算。在算术表达式中,未设置的变量默认为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

答案 1 :(得分:0)

如果您希望将文字值作为比较,请使用=代替-eq

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

算术二元运算符(-eq)如果arg1等于0,则$myvalue返回true,无论是0还是未设置。 。''为null,等于零。