我试图理解为什么未设置的变量被评估为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
答案 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,等于零。