• 完全总结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

  • 相关阅读:
    一元回归1_基础(python代码实现)
    fisher's exact test
    卡方检验(python代码实现)
    Hough transform(霍夫变换)
    【算法】怎样把一个单链表反序?
    HTTP请求格式和HTTP响应格式
    TCP/IP、SOCKET、HTTP之间的联系与区别
    Graphical vi-vim Cheat Sheet and Tutorial
    Linux远程上传、下载文件的方法
    matlab工作空间,变量的保存和载入
  • 原文地址:https://www.cnblogs.com/zejin2008/p/8412680.html
Copyright © 2020-2023  润新知