• 20.5 shell脚本中的逻辑判断 20.6 文件目录属性判断 20.7 if特殊用法 20.8/20.9 case判断


    20.5 shell脚本中的if逻辑判断

    Shell脚本中,充满着各种逻辑判断,是脚本中必备的。

    逻辑判断表达式:

    -gt (>);    大于    great than
    -lt(<);      小于     less than
    -ge(>=);  大于或等于   
    -le(<=);   小于或等于
    -eq(==);  等于     equal
    -ne(!=)    不等于  not equa
    - - -
    
    例如
    if [ $a -gt $b ]; 
    if [ $a -lt 5 ]; 
    if [ $b -eq 10 ]等
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    if逻辑判断格式

    格式1:if 条件 ; then 语句; fi
    格式2:if 条件; then 语句; else 语句; fi
    格式3:if …; then … ;elif …; then …; else …; fi
    - - -
    
    可以使用 && || 结合多个条件
    条件A&&条件B:A并且B
    条件A||条件B:A或者B
    if [ $a -gt 5 ] && [ $a -lt 10 ]; then
    if [ $b -gt 5 ] || [ $b -lt 3 ]; then
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    if逻辑判断例子

    格式1:if 条件 ; then 语句; fi

    #!/bin/bash
    a=5
    if [ $a -gt 3 ]
    #注意[]里面有大量空格
    then
           echo "ok"
    fi
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    格式2:if 条件; then 语句; else 语句; fi

    #!/bin/bash
    a=5
    if [ $a -gt 3 ]
    then
        echo "ok"
    else
        echo "nook"
    fi
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    格式3:if …; then … ;elif …; then …; else …; fi

    #!/bin/bash
    a=3
    if [ $a -gt 4 ]
    then
        echo ">1"
    elif [ $a -gt 6 ]
    #注意elif可以嵌套多次的
    then
        echo "<6 && >1"
    else
        echo "nook"
    fi
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    20.6 文件目录属性判断

    在shell中通常要和文件或者目录打交道,那么对于他们的属性判断十分重要。

    文件目录属性判断

    [ -f file ]判断是否是普通文件,且存在     [ -f /usr/bin/grep ]
    [ -d file ] 判断是否是目录,且存在   [ -d /tmp/mydir ]
    [ -e file ] 判断文件或目录是否存在   [ -e /var/log/syslog ]
    [ -r file ] 判断文件是否可读   [ -r /var/log/syslog ]
    [ -w file ] 判断文件是否可写  [ -w /var/mytmp.txt ]
    [ -x file ] 判断文件是否可执行  [ -x /usr/bin/grep ]
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    例子

    #!/bin/bash
    f="/tmp/zhouquniclinux"
    if [ -e $f ]
    then 
           echo $f exist
    else
          touch $f
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    上例可以简化为

    #!/bin/bash
    [ -e $f ] ||  touch $f
    [ ! -e $f ] || echo $f exist   
    # || 当前面的执行成功后再执行后面的命令
    # 如果是&&,则不管前面的命令是否执行成功,都会执行后面的命令
    # ! 表示取反
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    20.7 if特殊用法

    if特殊用法

    if [ -z "$a" ]  这个表示当变量a的值为空时会怎么样
    if [ -n "$a" ]  表示当变量a的值不为空
    if grep -q '123' 1.txt; then  表示如果1.txt中含有'123'的行时会怎么样
    if [ ! -e file ]; then 表示文件不存在时会怎么样
    if (($a<1)); then …等同于 if [ $a -lt 1 ]; then… 
    [ ] 中不能使用<,>,==,!=,>=,<=这样的符号
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    例子

    if [ -z “$a” ] 这个表示当变量a的值为空时会怎么样

    #!/bin/bash
    n='wc -l /tmp/lalala'
    if [ $n -lt 100 ]
    then
           echo "line num less than 100"
    fi
    # 如果/tmp/lalala文件为空,或者被删除的话,脚本就会运行出错,出现bug
    
    应该加上一个判断条件
    #!/bin/bash
    n='wc -l /tmp/lalala'
    if [ $n -z "$n" ]
    # [ $n -z "$n" ]  = [ ! $n -n "$n" ],-z 和 -n 是一对相反的条件
    then
           echo "error"
           exit
    elif [ $n -lt 100 ]
    then
            echo "line num less than 100"
    fi
    
    或者
    #!/bin/bash
    if [ ! -f /tmp/lalala ]
    then
           echo "/tmp/lalala is not exist"
           exit
    fi
    
    n='wc -l /tmp/lalala'
    if [ $n -lt 100 ]
    then
            echo "line num less than 100"
    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
    • 30
    • 31
    • 32
    • 33
    • 34

    if [ -n “$a” ] 表示当变量a的值不为空,也可以判断文件,判断文件时可以不加双引号

    if [ -n 01.sh ]; then echo "ok"; fi
    
    另外
    #!/bin/bash
    if [ -n "$b" ]
    then  
           echo $b
    else
            echo "b is null"
    fi
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    一条命令也可以作为判断条件。判断user1用户是否存在

    if grep -wq 'user1'  /etc/passwd; then echo "user1 is exist"; else echo "user1 is not exist"; fi
    #grep -w 显示过滤信息,加-q可以不显示过滤信息
    • 1
    • 2

    20.8/20.9 case判断

    case判断格式

    case 变量名 in
        value1)
          commond1
          ;;
        value2)
          commod2
          ;;
        value3)
          commod3
          ;;
    esac
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在case中,可以在条件中使用“|”,表示或的意思,如:

    2|3)
        commond
        ;;
    • 1
    • 2
    • 3

    例子: 输入一个同学的分数,判断成绩是否及格,优秀。

    [root@localhost sbin]# vim case1.sh
    #!/bin/bash
    read -p "Please input a number: " n
    # read -p 是读取用户的输入数据,定义到变量里面
    if [ -z "$n" ]
    then
        echo "Please input a number."
        exit 1
    #“exit 1”表示非正常运行导致退出程序
    #退出之后,echo $?会返回1值,表示程序退出是因为出错了
    fi
    
    n1=`echo $n|sed 's/[0-9]//g'`
    #判断用户输入的字符是否为纯数字
    #如果是数字,则将其替换为空,赋值给$n1
    if [ -n "$n1" ]
    then
    echo "Please input a number."
    exit 1
    #判断$n1不为空时(即$n不是纯数字)再次提示用户输入数字并退出
    fi
    
    #如果用户输入的是纯数字则执行以下命令:
    if [ $n -lt 60 ] && [ $n -ge 0 ]
    then
        tag=1
    elif [ $n -ge 60 ] && [ $n -lt 80 ]
    then
        tag=2
    elif [ $n -ge 80 ]  && [ $n -lt 90 ]
    then
        tag=3
    elif [ $n -ge 90 ] && [ $n -le 100 ]
    then
        tag=4
    else
        tag=0
    fi
    #tag的作用是为判断条件设定标签,方便后面引用
    case $tag in
        1)
            echo "not ok"
            ;;
        2)
            echo "ok"
            ;;
        3)
            echo "ook"
            ;;
        4)
            echo "oook"
            ;;
        *)
            echo "The number range is 0-100."
            ;;
    esac
    • 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
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    运行结果

    [root@host shell]# sh case1.sh
    Please input a number: 45
    not ok
    [root@host shell]# sh case1.sh
    Please input a number: 66
    ok
    [root@host shell]# sh case1.sh
    Please input a number: 80
    ook
    [root@host shell]# sh case1.sh
    Please input a number: 99
    oook
    [root@host shell]# sh case1.sh
    Please input a number: xxx
    Please input a number.
    [root@host shell]# echo $?
    1
    [root@host shell]# sh case1.sh
    Please input a number: 120
    The number range is 0-100.
    [root@host shell]# echo $?
    0
  • 相关阅读:
    053592
    053591
    053590
    053589
    053588
    053676
    C# WPF Border控件总结
    Android Studio 添加jar或aar依赖的两种方式
    javascript Date与string之间的转换
    C#:使用dsoframer.ocx控件实现内嵌office效果(详解)
  • 原文地址:https://www.cnblogs.com/pta188/p/9299464.html
Copyright © 2020-2023  润新知