在bash脚本编程中,我们经常做一些条件判断, 我们主要用到了三种,test,单中括号,双中括号
经常有看到不同的写法,如:
[ $? –eq 0 ] [[ $myvar == “mysql” ]] test 1 -eq 0
并且还有看到一些并且和或的写法,如-a,-o,&&,||。
那这些都是怎么结合,有那么多的比较符号,我怎么记住,有什么注意事项。
1.test命令
test是bash的一个内建命令,用来测试后面给的条件是否为真,如
[root@localhost ~]# test 1 -ne 0 [root@localhost ~]# echo $? 0 [root@localhost ~]# test "hello" == "Hello" [root@localhost ~]# echo $? 1
经常有可能我们有很多判断需求,如判断是否是一个文件,字符串是否为空,数值A是否大于B等,有时会记不住,怎么办呢,方法是man test,可以看到它列出了所有的判断符号和说明:
2.单个中括号[ ]判断
事实上事实上[ 这个是个内建命令,可以执行which [查看
[root@localhost test]# which [
/usr/bin/[
即然是命令,那么命令与后面的参数就得用空格隔开,这也就是为什么在使用[时后面需要有一个空格的原因。所以[1=2]这样的写法将会报错。
单中括号与test命令是等价的。
3.双个中括号[[ ]]判断
双括号是不是也是个命令呢,我们也用which看下:
[root@localhost ~]# which [[
/usr/bin/which: no [[ in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)
我们再用type命令看下
[root@localhost ~]# type [[
[[ is a shell keyword
可以看到双中括号是shell中的关键字,在这我们也用type看看test与单中括号:
[root@localhost ~]# type test [
test is a shell builtin [ is a shell builtin
两个中括号也是用来做判断的,与单个中括号相比,从某方面来讲它更安全一些,如:
[root@localhost ~]# unset myvar
[root@localhost ~]# if [ $myvar -eq 0 ];then echo 1;fi
-bash: [: -eq: unary operator expected
[root@localhost ~]# if [[ $myvar -eq 0 ]];then echo 1;fi
1
[[使用==或!=时支持字符串的模式匹配,比如[[ hello == hell? ]],结果为真。
使用=~操作符时支持正则表达式匹配,如(注意右边的匹配串不要加引号):
[root@localhost ~]# [[ “234” =~ [1-9]{3} ]]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ "234" =~ "[1-9]{3}" ]]
[root@localhost ~]# echo $?
1
4.如何结合-o -a && || :
因为-a与-o是test与单中括号命令的参数,而&&与||是shell中的关键字,所以-a与-o只能在test与单中括号使用,不能在双中括号使用,而&&和||可以在任何情况使用,如
[root@localhost ~]# test 1 -eq 1 -a 2 -eq 2 [root@localhost ~]# echo $? 0 [root@localhost ~]# [ 1 -eq 1 ] || [ 2 -eq 3 ] [root@localhost ~]# echo $? 0
注意双号号下这两种写法都可以:
[root@localhost ~]# [[ 1 -eq 1 ]] && [[ 2 -eq 3 ]]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [[ 1 -eq 1 || 2 -eq 3 ]]
[root@localhost ~]# echo $?
0
另外,在一些需要使用()分组的情况下,因为test与[是命令,它不解析小括号分组,所以不能在这两个命令中使用小括号来分组
[root@localhost ~]# test ( 1 -eq 2 -o 3 -eq 3 )
-bash: syntax error near unexpected token `1'
5.实践中使用建议:
A.尽量使用双中括号来进行判断
B.在test及单中括号使用中,如果有变量,尽量用双引号括起来
C.与或尽量使用&&与||,而不要使用-a -o