2011-06-29 87 views
4

如果脚本有“”,为什么bash的行为如此?

if [ $1 == "-?" ]; then #line 4 
    echo "usage: ...." 
fi 

当脚本获取运行不带任何参数,它会抱怨

./script.sh: line 4: [: ==: unary operator expected 

但如果不是

if [ "$1" == "-?" ]; then #line 4 
    echo "usage: ...." 
fi 

然后一切都很好

这是为什么?

感谢

回答

5

如果第一个参数缺少或为空,你的第一个脚本计算结果为:

if [ == "-?" ] ; then 

...这是一个语法错误。正如您所注意到,以防止你需要做的""使用,那么它的计算结果为:

if [ "" == "-?" ] ; then 

据我所知,这是由于原来的Bourne shell是工作的方式。你应该让它成为一个习惯,将变量放在""中,以便也可以正确使用其中包含空格的参数。例如,如果你打电话给你的脚本是这样的:

./myScript "first argument has spaces" 

那么你的第一个脚本将评估为:

if [ first argument has spaces == "-?" ] ; then 

这也是一个语法错误。如果你使用空格传递文件名,rm $1也不会做你想做的事。改为rm "$1"

5

因为[执行前替换值。 [[不会,所以会按预期工作。

相关问题