Bash中的if判断

[]是一个三目函数(可以这么理解,但很可能不正确),所以使用时,需要将三个参数用空格分开,如[ "abc" = "cde" ],那么命令[接收的三个参数分别为"abc",=,"cde",缺少哪一个空格都会有问题。

缺少最开始的空格,会报错“找不到["abc"命令”,因为Bash把它俩看成是一块的了。没有最后一个空格,命令[都会报错,告诉你命令[不知道参数要读到哪里为止。缺少=两边的空格,那么该条件判断总为真,因为它把中间的整个看成了一个字符串,字符串不为空(因为至少有一个=号嘛),所以总为真。

当一个变量没定义,或者定义为"",那么使用下面的语句是正确的(注意代码中的空格与引号):

arg=""
if [ "$arg" = "" ]; then
    echo yes
else
    echo no
fi

当一个变量没有定义,或者定义为"",使用以下写法命令[会报错:

if [ $arg = "" ]; then
    echo yes
else
    echo no
fi

估计是当一个变量没有定义或者为""时,Bash便不会作为参数传递,导致[抱怨缺少参数,错误信息为:bash: [: =: unary operator expected。

还有一种写法也是常见到的:

if [ xxx$arg = "xxx" ]; then
    echo yes
else
    echo no
fi

因为在变量arg前加了xxx,所以即使变量arg没有定义或者为"",也能够保证命令[能够得到三个参数,达到判断的效果。当然加xxx还是yyy完全由你自己决定。除此外还有两种解决方法,方法一为使用默认参数(当然这里的NULL也是随意的):

if [ ${arg:-NULL} = "NULL" ]; then
    echo yes
else
    echo no
fi

方法二为使用[[]]

if [[ $arg = "" ]]; then
    echo yes
else
    echo no
fi

[命令可以看成是一个三目函数,同时也可以看成是test函数的简写。如果只是查看某个变量是否为空,如下写法也许会更方便:

if [ -z $arg ]; then
    echo yes
else
    echo no
fi

相当于

if test -z $arg; then
    echo yes
else
    echo no
fi

脚本看多了,发现各家都有自己的风格,Linux下的脚本还常常出现如下的风格:

[ "abc" = "cde" ] && echo yes || echo no

这个风格不错,尽管不大好理解,不过一行能搞定,感觉比较爽。

到最后还是要说一句,[是一个命令,一个以符号为名字的命令,就你Javascript中的$()函数一样,名字奇怪了点罢了。你可以通过命令whereis [来找到它,估计会在/usr/bin/下面,不要把它误解为Bash的关键字,或者是一个内部函数什么的。

发表于 2010年11月24日 03:36   评论:0   阅读:2473  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo