问题现场:
想判断一个变量是否等于某一个值。建立脚本:test.sh
#!/bin/bash
myvar="foo bar oni"
echo $myvar
if [ $myvar = "foo bar oni" ]
then
echo "yes"
fi
报错:如果环境变量中恰巧有一个空格或制表键,bash 将无法分辨,从而无法正常工作。这里$myvar的值中有空格。这个错误可以理解为左边$mmyvar是三个arguments,即:foo bar oni = "foo bar oni","foo bar oni"是一个arguments,所以两者作比较的时候,变量个数不同,报错。
(tf) localhost:offline wang$ sh test.sh
foo bar oni
test.sh: line 5: [: too many arguments
尝试一:将$myvar转为字符串
#!/bin/bash
myvar="foo bar oni"
echo $myvar
if [ "$myvar" = "foo bar oni" ]
then
echo "yes"
fi
输出了yes,可见成功了,$myvar转为字符串后,表示一个变量。
(tf) localhost:offline wang$ sh test.sh
foo bar oni
yes
尝试二:改变$myvar的值,将其改为foo,也就是一个变量的情况。
#!/bin/bash
myvar="foo"
echo $myvar
if [ $myvar = "foo bar oni" ]; then
echo "yes"
else
echo "no"
fi
此时,if中的条件$myvar = "foo bar oni" 为false,即"foo" != "foo bar oni",输出no。
(tf) localhost:offline wang$ sh test.sh
foo
no
总结:
1.if中的条件判断,如果是字符,则需要变量个数相等,并且bash无法识别空格或者tab键盘,此时需要自己修改判断条件。
2.养成将所有字符串自变量用双引号括起的习惯,将除去很多类似的编程错误。(如果要扩展环境变量,则必须将它们用 双引号、而不是单引号括起)
参考: