• bash if条件判断


    bash if条件判断

    在bash中,if是可以对语句做选择执行,做if条件测试有整数测试,字符测试,文件测试三种形式。

    if格式

    单分支语法

    if 条件; then
        语句1
        语句2
        ... 
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5

    双分支语法

    if 条件;then
        语句1
        语句2
    else
        语句2
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    多分支语法

    if 条件1; then
        语句1
        语句2
    elif 条件2; then
        语句1
        语句2
    else
        语句1
        语句2
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    条件测试

    if的判断条件具体可以有以下几种形式

    1. [ express ]
    2. [[ express ]]
    3. test express
    4. bash命令(命令执行成功则执行语句)

    [],[[]],test作用类似,基本上在编写bash脚本时可以互换
    注意:[],[[]]空格位置;
    [1个空格+表达式+1个空格]
    [[1个空格+表达式+1个空格]]

    示例:bash命令做if条件

    示例1:查看系统是否有hadoop用户,如果有返回uid和shell,没有返回no

    [root@node1 bash_test]# cat 17.sh 
    #!/bin/bash
    
    if id -u hadoop &> /dev/null;then
        grep "^hadoop" /etc/passwd | cut -d: -f1,7
    else
        echo no
    fi
    [root@node1 bash_test]# ./17.sh 
    hadoop:/bin/bash
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注意:

    1. id -u hadoop &> /dev/null指令的作用是执行id -u hadoop将其回执丢掉(不在终端显示)
    2. bash命令做if条件时,当命令状态返回值为真即值为0时,条件满足:命令状态返回值1-255即条件不满足

    命令状态返回值
    我们可以使用$?查看上一条命令的命令状态返回值,命令成功执行返回0,失败执行返回1

    [root@node1 bash_test]# id hadoop
    uid=4024(hadoop) gid=4024(hadoop) 组=4024(hadoop),4026(mygrp)
    [root@node1 bash_test]# echo $?
    0
    [root@node1 bash_test]# id hadoop111
    id: hadoop111: no such user
    [root@node1 bash_test]# echo $?
    1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    当然在bash脚本中,我们可以使用exit退出程序时,后面接的数字则代表命令执行情况。例如:exit 0代表执行成功,exit 1代表执行失败

    整数测试

    if条件测试是为了比较整数时,具体规则如下
    expression: 数值1 比较符号 数值2
    比较符号:
    大于 -gt
    大于或等于 -ge
    等于 -eq
    不等于 -ne
    小于 -gt
    小于或等于 -ge

    示例1:读取一个参数,如果他小于10返回Yes,大于10返回No

    [root@node1 bash_test]# cat 18.sh 
    #!/bin/bash
    
    if [ $1 -lt 10 ];then
      echo Yes
    else
      echo No
    fi
    [root@node1 bash_test]# ./18.sh 5
    Yes
    [root@node1 bash_test]# ./18.sh 11
    No
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    注意:$1代表终端传入的第一个参数
    bash中位置变量有:
    $1,$2,$3…
    $@ $* 显示所有位置变量
    $@ 五个字符串当成一个字符串显示
    $* 五个字符串各自显示
    $# 显示位置变量个数
    $? 保存刚刚执行命令的状态返回值
    shift 实现位置参数轮替
    结合shfit可以使用一个$1可以得到所有的变量
    shfit 2 指定轮替2个

    例如:执行命令./18.sh 5
    $0为./18.sh
    $1为5
    @ 和 @和 @* 均为"./18.sh 5"
    $#为1

    示例2:写一个脚本随机生成两个数,比较其大小

    [root@node1 bash_test]# cat 19.sh 
    #!/bin/bash
    
    A=$RANDOM
    B=$RANDOM
    result=""
    if [ $A -lt $B ];then
      result="A is greater than B"
    elif [ $A -gt $B ];then
      result="A is less then B"
    else
      result="A equals B"
    fi
    echo "A = $A, B = $B, $result"
    
    [root@node1 bash_test]# ./19.sh 
    A = 6646, B = 3889, A is less then B
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    $RANDOM 生成随机数 0-32767之间的数

    字符测试

    if条件为字符比较大小时,默认以ASCII码表做大小比较
    除了使用符号-lt,-gt,-le,-ge,-eq,-ne做判断,我们也可以使用下述符号做判断

     > : 大于
     < : 小于
     == :等于
     != :不等于
    单目测试
     -z $STRING 字符串的长度,为空则为真,非空为假
     -n $STRING 为空则为假,不空则真
     =~ 判断左边的字符串是否能够被右边的模式所匹配,通常用于双[[  ]]中
         一般用行首,行尾锚定$,不能用词首词尾锚定\< \> 
        不能用引号
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    一般我们用==比较多,用来判断两个字符串是否相等

    示例1:写一个脚本,可以接受一个参数,其使用形式如下所示:
    script.sh {start|stop|restart|status}
    其中:
    如果参数为start,则创建空文件/var/lock/subsys/script,并显示“starting script successfully.”
    如果参数为stop,则删除文件/var/lock/subsys/script,并显示“Stop script successfully.”
    如果参数为restart,则删除文件/var/locksubsys/script并重新创建,而后显示“Restarting script successfully.”
    如果参数为status,那么:如果文件/var/lock/subsys/script存在,则显示“Script is running…”,否则,则显示“Script is stopped.”
    其他任何参数;则显示“script.sh {start|stop|restart|status}”

    #!/bin/bash
    # echo $1
    if [ $1 == "start" ];then
        if [ -e /var/lock/subsys/script ];then
            echo  "script is already running."
        else
            mkdir /var/lock/subsys/script
            echo  "Starting script successfully."
        fi
    elif [ $1 == "stop" ];then
        if [ -e /var/lock/subsys/script ];then
            rm -rf /var/lock/subsys/script
            echo "Stop script finished."
        else
            echo "script is stopped yet."
        fi
    elif [ $1 == "restart" ];then
        rm -rf /var/lock/subsys/script
        mkdir /var/lock/subsys/script
        echo  "Restarting script successfully."
    elif [ $1 == "status" ];then
        if [ -e /var/lock/subsys/script ];then
            echo "script is running."
        else
            echo "script is stopped."
        fi
    else
        echo "script.sh {start|stop|restart|status}"
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    文件测试

    对文件进行操作,主要有以下几种

    单目测试
     -f 测试其是否为普通文件,即ls -l 时文件类型为-的文件  
     -d 测试其是否为目录文件,即ls -l 时文件类型为-的目录  
     -e 测试文件是否存在,存在为真  
     -r,-w,-x这三个都是判断文件权限,是否有读,写,执行权限  
     -s 测试文件大小是否不空,不空则真,空为假
     -l -b -c这三个判断文件是否为相应类型
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    示例:如果/tmp/test10不存在,则创建它

    [root@node1 bash_test]# cat 21.sh 
    #!/bin/bash
    
    if [ ! -e /tmp/test10 ];then
        mkdir /tmp/test10
    fi
    [root@node1 bash_test]# ls -ld /tmp/test10
    ls: 无法访问/tmp/test10: 没有那个文件或目录
    [root@node1 bash_test]# ./21.sh 
    [root@node1 bash_test]# ls -ld /tmp/test10
    drwxr-xr-x 2 root root 6 8月   1 21:21 /tmp/test10
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    组合条件测试

    当有多个判断需要做时,可以使用如下进行连接

    符号符号意义示例解释
    -a与,符号左右两边都需要满足;[ $A > 300 -a $A < 500 ]A变量值大于300,而且要小于500满足条件
    -o或,符号左右两边只要满足一个;[ $B < 10 -o $A > 100 ]B变量小于10或者A变量小于100
    !非,将结果取反;[ ! id hadoop &> /dev/null ]如果没有hadoop用户则满足条件

    如果使用独立命令做组合条件时,使用与&&,||或,!非

    示例1:写一个脚本,给定用户,如果不存在退出脚本

    [root@node1 bash_test]# cat 20.sh 
    #!/bin/bash
    
    if ! id $1 > /dev/null;then
        echo "no find this user"
        exit 6
    else
        id $1
    fi
    [root@node1 bash_test]# ./20.sh hadoop
    uid=4024(hadoop) gid=4024(hadoop) 组=4024(hadoop),4026(mygrp)
    [root@node1 bash_test]# ./20.sh hadoop1
    id: hadoop1: no such user
    no find this user
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    示例2:通过参数传-一个字符串给脚本,如果传递的字符串为“memory"或"Memory",就以MB为单位显示当前主机的内存信息:否则,就显示/proc/uptime文件的内容。

    #!/bin/bash
    
    if [[ $1 == "memory" || $1 == "Memory" ]]; then
       free -tm
    else
       cat /proc/uptime
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注意:
    || 短路操作,前面为真,不会运行后面
    && 前面为假,无需运算后面

    如果我们需要前面为假,运行后面程序,使用||
    如果我们需要前面为真,运行后面程序,使用&&

    示例1:如果/tmp/test10不存在,则创建它
    [ -e /tmp/test10 ] || mkdir /tmp/test10

    示例2:如果/tmp/test10文件夹存在,则在该文件夹下创建hello文件
    [ -d /tmp/test10 ] && touch /tmp/test10/hello

    示例3:如果/tmp/test10/hello文件存在,则显示’exist’;不存在则显示’not exist’
    [ -f /tmp/test10/hello ] && echo "exist" || echo "not exist"

  • 相关阅读:
    UE4 MVP 坐标转换
    单接口的批量测试如何实现
    Python开发利器KeymouseGo,开源的就是香
    【Java SE】抽象类和接口
    MySQL单表查询与多表查询
    lvs集群
    博纳影业明日上市:于冬陷入与江疏影绯闻 被曝斥资千万买珠宝
    net自动排课系统完整源码(适合智慧校园)
    Android---App 崩溃
    后端传递数据给前端做导出Excel的vo类
  • 原文地址:https://blog.csdn.net/xgy123xx/article/details/126110515