美文网首页
5.条件测试操作与流程控制语句

5.条件测试操作与流程控制语句

作者: 不安分的情绪 | 来源:发表于2018-01-20 14:38 被阅读0次

    在编写Shell脚本时候,经常需要判断两个字符串是否相等,检查文件状态或者是数字的测试等。Shell提供了对字符串、文件、数值等内容的条件测试以及逻辑流程控制。

    条件测试操作

    常用得测试操作
    test命令,测试特定得表达式是否成立,当条件成立时,命令返回值为0,否则为其它值。

    格式1test 条件表达式
    格式2[ 条件表达式 ] //常用格式,使用方括号时,要注意在条件两边加上空格。

    常见得测试类型:

    • 测试文件状态
    • 字符串比较
    • 整数值比较
    • 逻辑测试

    测试文件

    格式[ 操作符 文件或目录 ]

    操作符 说明
    -d 测试是否为目录 ,是则为真 (Directory)
    -e 测试目录或文件是否存在,存在则为真(Exist)
    -f 测试是否为文件,是则为真(file)
    -r 测试当前用户是否有权限读取,是则为真(read)
    -w 测试当前用户是否有权限写入,是则为真(write)
    -x 测试当前用户是否可执行该文件,可执行则为真(Excute)
    -L 测试是否为符号链接文件,是则为真(Link
    -nt file1 -nt file2 如果 file1file2 新(修改时间),则为真
    -ot file1 -ot file2 如果 file1file2 旧(修改时间),则为真

    字符串比较

    格式
    [ String1 = String2 ]
    [ String1 != String2 ]
    [ -z String ]

    操作符 说明
    = 字符串内容相同则为真,就是说包含的文本一摸一样。
    != 字符串内容不同,则为真(!号表示相反的意思)
    -z 字符串内容为空(长度为零)则为真
    -n 字符串内容非空(长度非零)则为真
    < string1 < string2 如果string1在本地的字典序列中排在string2之前,则为真
    > string2 如果string1在本地的字典序列中排在string2之后,则为真

    注意:

    • 在=前后各有一个空格,如果没有空格就是赋值的关系,不是比较的关系。
    • 字符串的> <比较运算符,一般放在[[ ]]之中,而不是test ("[]")
    • 字符串的> <比较的结果,与本地的locale有关,是按照其字典序列进行比较的

    整数值比较

    格式[ no1 操作符 no2 ]

    操作符 说明
    -eq 等于
    -ne 不等于
    -gt 大于
    -lt 小于
    -le 小于等于
    -ge 大于等于

    逻辑测试

    格式[ 表达式1 ] 操作符号 [ 表达式2 ]

    操作符 说明
    -a 或 && 逻辑与、前后两个表达式都成立时整个测试结果才为真,否则为假
    -o 或 || 逻辑或、操作符两边至少一个为真时,结果为真,否为为假
    逻辑否 、 当制定条件不成立时,返回结果为真

    流程控制语句

    与其他变成语言一样,shell有自己的流程控制语句,其中包括条件语句、循环语句、选择语句等。

    if条件语句

    if 单分支: 当条件成立时执行相应的操作。

    if 条件测试操作
      then 命令序列
    fi
    
    #!/bin/bash
    # 当/boot分区的使用空间超过80%,就输出报警信息
    use=`df -hT|grep "/boot" | awk '{print $5}' | cut -d "%" -f1`
    if [[ $use -gt 80 ]];
      then
        echo "Warning!!/boot disk is full"
    fi
    

    if 双分支:当条件成立、条件不成立时执行不同操作。

    if 条件测试命令
      then 命令序列1
      else 命令序列2
    fi
    
    #!/bin/bash
    # 判断一个用户是否存在
    #
    No=`id -u $1`
    if [[ "$No" -gt 0 ]];then
        echo "$1 is exsit"
    else
        useradd $1 &> /dev/null&& echo "$1 is add"
    fi
    

    if多分枝:相当于if语句嵌套,针对多个条件执行不同操作。

    if 条件测试命令1 ; then
     命令序列1
    elif 条件测试命令2 ; then
     命令序列2
    elif ...
    else
     命令序列n
    fi
    
    #!/bin/sh
    SYSTEM=`uname -s`    #获取操作系统类型,我本地是linux
    if [ $SYSTEM = "Linux" ] ; then     #如果是linux的话打印linux字符串
    echo "Linux"
    elif [ $SYSTEM = "FreeBSD" ] ; then  
    echo "FreeBSD"
    elif [ $SYSTEM = "Solaris" ] ; then
    echo "Solaris"
    else
    echo "What?"
    fi     #ifend
    

    for循环语句
    根据变量的不同取值,重复执行一组命令操作。

    for 变量名 in 取值列表
    do
     命令序列
    done
    
    #!/bin/bash 
    #
    for i in 1 2 3 4 5;do  //{1..5}
        echo $i
    done
    

    while循环

    重复测试指令的条件,只要条件为真则反复执行对应的命令操作,直到条件为假。如果使用true作为循环条件能够产生无限循环。

    while 命令表达式
    do
      命令列表
    done
    
    #!/bin/bash
    #批量添加20个系统账户用户名依次为user1~20
    i=1
    while [ $i -le 20 ];do
        useradd user$1
        echo "123456" | passwd --stdin user$i &> /dev/null
        i=`expr $i + 1`
    done
    

    只要特定条件为真,”while” 语句就会循环执行。

    case多重分支语句

    根据变量的不通取值,分别执行不同的命令操作。

    case 变量值 in
     模式1)
     命令序列1
    ;;
     模式2)
     命令序列2
    ;;
     ……
    *)
     默认执行的命令序列
    ;;
    esac
    
    #!/bin/bash
    case $1 in
    start)
      echo "start [mysql](http://man.linuxde.net/mysql "mysql命令")"
    ;;
    stop)
      echo "stop mysql"
    ;;
    *)
      echo "usage: $0 start|stop"
    ;;
    esac
    

    until循环语句

    根据条件执行重复操作,直到条件成立为止。只要特定条件为假,它们就重复循环,直到条件为真。

    until 条件测试命令
    do
     命令序列
    done
    
    #!/bin/bash
    #
    num=1
    until [ $num -gt 10 ];do
        echo $num
        num=$(( $num + 1))
    done
    

    break控制语句

    break语句:在for、while、until等循环语句中,用于跳出当前所在的循环体,执行循环体之后的语句。

    # cat break.sh
    #!/bin/bash
    #
    num=1
    until [ $num -gt 10 ];do
        echo $num
        if [ $num -gt 5 ];then break ;fi  //当num>5时,跳出整个循环
        num=$(( $num + 1))
    done
    
    # bash break.sh
    1
    2
    3
    4
    5
    6
    

    continue控制语句

    continue语句:在for、while、until等循环语句中,用于跳过循环体内余下的语句,重新判断条件以便执行下一次循环。

    while<-------+
     do          |
                 |
    commands     | 跳回当前循环,重新开始下一次循环(通常在循环体中与条件语句一起使用)
    commands     |
                 |
     continue----+
    
    commands
    commands
    commands
     done
    commands
    commands
    
    
    

    相关文章

      网友评论

          本文标题:5.条件测试操作与流程控制语句

          本文链接:https://www.haomeiwen.com/subject/yhttaxtx.html