完全总结bash中的条件判断test [ [[ 使用

在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

原文地址:https://www.cnblogs.com/zejin2008/p/8412680.html