“”1美元,为什么bash表现得像这样?

时间:2011-06-29 17:49:44

标签: bash

如果脚本有

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

当脚本在没有任何参数的情况下运行时,它会抱怨

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

但是如果相反

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

然后一切都很好

为什么会这样?

感谢

2 个答案:

答案 0 :(得分:5)

因为[在执行之前替换了值。 [[没有,因此会按预期工作。

答案 1 :(得分:5)

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

if [ == "-?" ] ; then

...这是一个语法错误。正如您所注意到的,为了防止您需要使用"",它会评估为:

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

AFAIK这是由于原始Bourne shell的工作方式。你应该养成在""中包含变量的习惯,以便在包含空格的参数中正常工作。例如,如果你像这样调用你的脚本:

./myScript "first argument has spaces"

然后您的第一个脚本将评估为:

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

这也是语法错误。如果您使用空格传递文件名,rm $1之类的内容也无法执行您想要的操作。请改为rm "$1"