为什么未设置的变量在 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
或根本没有设置... ''
为空,等于零。
我想了解为什么未设置的变量被评估为 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
或根本没有设置... ''
为空,等于零。