• shell脚本中的条件测试和条件语法


    内容预知

     1.条件测试的语法

    1.1  引言 

    1.2 文件测试操作符 

     1.3  整数值的比较

    1.4 字符串比较 

    1.5 浮点运算(小数运算) 

     

    1.6  逻辑测试

    1.6.1   二元运算式

     1.6.2 三元表达式

    2. if的条件语句的语法

    2.1 if的单分支

    2.2    if双分支语句

    2.3 if多分支语句

     3. case语句

     总结


     1.条件测试的语法

    1.1  引言 

     在shell脚本中进行条件判断的两种通式:

    方式一:        test [操作符选项] 表达式

    方式二:       [ 操作符选项 表达式 ]  两边要有空格

    在Java中有boolean值来帮助我们识别逻辑判断条件的真假,在shell脚本中通过特俗变量$?同样能够达到判断上一命令执行的状态是否成功(返回码  0  为执行成功!非0则为执行异常!

    1.2 文件测试操作符 

    -e   测试 指定的文件或者目录是否存在
    -f  测试 指定的对象是否为文件;指定的文件是否存在
    -d   测试 指定的对象是否为目录;指定的目录是否存在
    -r   测试 当前用户是否有读权限
    -w   测试 当前用户是否有写权限
    -x  测试 当前用户是否有执行权限
    -L  测试文件是否为符号链接(软链接文件)

     运用演示:

    1. [root@localhost ~]#mkdir -p /test
    2. [root@localhost ~]#cd /test
    3. [root@localhost test]#mkdir test1
    4. [root@localhost test]#test -e /test/test1
    5. [root@localhost test]#echo $?
    6. 0
    7. [root@localhost test]#touch /test/test1.txt
    8. [root@localhost test]#[ -f /test/test1 ]
    9. [root@localhost test]#echo $?
    10. 1
    11. [root@localhost test]#[ -f /test/test1.txt ]
    12. [root@localhost test]#echo $?
    13. 0
    14. [root@localhost test]#[ -x /test/test1.txt ]
    15. [root@localhost test]#echo $?
    16. 1
    17. [root@localhost test]#chmod +x /test/test1.txt
    18. [root@localhost test]#ll test.1
    19. ls: 无法访问test.1: 没有那个文件或目录
    20. [root@localhost test]#ll test1.txt
    21. -rwxr-xr-x. 1 root root 0 824 20:10 test1.txt
    22. [root@localhost test]#[ -x /test/test1.txt ]
    23. [root@localhost test]#echo $?
    24. 0
    25. [root@localhost test]#echo $?

    该测试总结:  运用文件测试符到测试通式子,结合$?的返回值,可以准确且快速的得出我们想要的文件属性结果和是否存在。当然在命令环境下,显得没有什么作用,但是在脚本环境,可以作为很多判断条件和执行条件 

     1.3  整数值的比较

     操作符:      

    -eq等于
    -gt  大于  
    -lt  小于      
    -ge 大于等于
    -le小于等于
    -ne  不等于    

    运用演示:

    1. [root@localhost test]#test 1 -eq 1
    2. [root@localhost test]#echo $?
    3. 0
    4. [root@localhost test]#[ 2 -lt 3 ]
    5. [root@localhost test]#echo $?
    6. 0
    7. [root@localhost test]#[ 2 -lt 1 ]
    8. [root@localhost test]#echo $?
    9. 1
    10. [root@localhost test]#[ 2 -le 3 ]
    11. [root@localhost test]#echo $?
    12. 0
    13. [root@localhost test]#[ 2 -gt 3 ]
    14. [root@localhost test]#echo $?
    15. 1
    16. [root@localhost test]#[ 4 -ge 3 ]
    17. [root@localhost test]#echo $?
    18. 0
    19. [root@localhost test]#[ 4 -ne 3 ]
    20. [root@localhost test]#echo $?
    21. 0

     

     该测试总结:运算符在if条件中,起到了判断左右边值关系的作用。根据关系分析相对应的结果

    1.4 字符串比较 

    =字符串内容相同
    !=字符串内容不同,! 号表示相反的意思
    -z字符串内容为空
    -n字符是否存在

     运用演示:
     

    1. [root@localhost ~]#yang=1
    2. [root@localhost ~]#wang=abc
    3. [root@localhost ~]#liu=1
    4. [root@localhost ~]#[ $yang = $liu ]; echo $?
    5. 0
    6. [root@localhost ~]#[ $yang = $wang ]; echo $?
    7. 1
    8. [root@localhost ~]#[ $yang != $liu ]; echo $?
    9. 1
    10. [root@localhost ~]#[ -z $yang ]; echo $?
    11. 1
    12. [root@localhost ~]#[ -n $yang ]; echo $?
    13. 0
    14. [root@localhost ~]#[ -z "$yang" ]; echo $?
    15. 1
    16. [root@localhost ~]#[ -n $"yang" ]; echo $?
    17. 0

    1.5 浮点运算(小数运算) 

    方式一  :    echo "浮点运算字符串" | bc

    方式二:      awk 'BEGIN {print 浮点运算字符串}'
     

     

    1. [root@localhost ~]#i=1.1*1.2
    2. [root@localhost ~]#awk 'BEGIN {print '$i'}'
    3. 1.32
    4. [root@localhost ~]#echo "$i"|bc
    5. 1.3
    6. [root@localhost ~]#echo "scale=2; $i"|bc
    7. 1.32

     

     

    1.6  逻辑测试

     

    • -a或&& :逻辑与,“而且”的意思,全真才为真。
    • -o或|| :逻辑或,“或者”的意思,一真即为真。
    • ! :逻辑否。

     

    1.6.1   二元运算式

     [ 表达式1 ] && [ 表达式2 ]  等同于   [ 表达式1 -a 表达式2 ]    [[ 表达式1 && 表达式2 ]] 
    [ 表达式1 ] || [ 表达式2 ]       等同于   [ 表达式1 -o 表达式2 ]    [[ 表达式1 || 表达式2 ]] 

     

    1. [root@localhost ~]#[ 1 -eq 2 ] || [ 1 -eq 1 ]
    2. [root@localhost ~]#echo $?
    3. 0
    4. [root@localhost ~]#[ 1 -eq 2 ] && [ 1 -eq 1 ]
    5. [root@localhost ~]#echo $?
    6. 1
    7. [root@localhost ~]#[ 1 -eq 2 -o 1 -eq 1 ]
    8. [root@localhost ~]#echo $?
    9. 0
    10. [root@localhost ~]#[[ 1 -eq 2 || 1 -eq 1 ]]
    11. [root@localhost ~]#echo $?
    12. 0
    13. [root@localhost ~]#[ 1 -eq 2 -a 1 -eq 1 ]
    14. [root@localhost ~]#echo $?
    15. 1
    16. [root@localhost ~]#[[ 1 -eq 2 && 1 -eq 1 ]]
    17. [root@localhost ~]#echo $?
    18. 1

     

     

     1.6.2 三元表达式

    • [ 表达式 ] && a || b
    • 当表达式为真时,取a值;当表达式为假时,取b值。
    1. [root@localhost ~]#[ 1 -eq 2 ] && echo true || echo false
    2. false
    3. [root@localhost ~]#[ 1 -eq 1 ] && echo true || echo false
    4. true
    5. [root@localhost ~]#[ 1 -lt 1 ] && echo true || echo false
    6. false

     

     

     

    2. if的条件语句的语法

     

    2.1 if的单分支

     格式:

      if [判断条件] ;​ then

             条件成立的分支代码

     fi      

     

     运用演示:

    需求:写一个能够启动就能监视/boot目录空闲率的脚本,并且当空闲率达到百分之八十时就能够发出报警提示 

    1. vim free.sh
    2. #!/bin/bash
    3. i=$( df |grep /boot|awk '{print $5}'|awk -F% '{print $1}')
    4. free_disk=$[100-$i]
    5. if [ $free_disk -le 96 ]
    6. then echo "/boot目录的空闲率不足百分之八十,当前空闲率为$free_disk%"
    7. fi

     

     

    结果输出:

    bash  free.sh

     

     

    2.2    if双分支语句

     格式:

      if  [判断条件] ;  then  

             条件成立的分支代码

     else

                条件不成立的分支代码  

       fi

     

     

     

     运用演示:

    需求:写一个判断当前目录下中是否存在一个test.sh的文件

    1. #!#/bin/bash
    2. #判断test文件是否存在
    3. [ -e /root/test.sh ] &>/dev/null
    4. if [ $? -eq 0 ];then
    5. echo "test.sh 文件是存在的!"
    6. else
    7. echo "tesh.sh 文件并不存在!"
    8. fi
    9. ~

     

     

     结果:

     

     

    2.3 if多分支语句

     

     格式:

      if  [判断条件] ;  then  

             条件成立的分支代码

    elif [ 判断条件];then 

             条件成立后的代码 

     else

                条件不成立的分支代码  

       fi

     

     

     运用演示:

    需求:写一个分析不同阶段分数应该得到不同评价的shell脚本

     

    1. #!/bin/bash
    2. read -p "请输入你本次的成绩:" score
    3. if [ $score -eq 100 ];then
    4. echo "优秀!"
    5. elif [ $score -le 99 ] && [ $score -ge 80 ] ;then
    6. echo "良好!"
    7. elif [ $score -le 79 ] && [ $score -ge 60 ] ;then
    8. echo "及格!"
    9. elif [ $score -le 59 ] && [ $score -ge 0 ] ;then
    10. echo "继续努力!"
    11. else
    12. echo "输入有误!请输出0-100的分数值!"
    13. fi

     

    结果:

     

     

     

     3. case语句

     格式:

    case 变量引用 in

     模式1)

      命令分支1

      ;;  模式2)

      命令分支2

      ;;  

    ...  

    *)

      默认命令分支  

    esac

     

     * 任意长度任意字符  
    ?任意单个字符  
    [0-9]指定范围内的任意单个字符
    | “或者”

     

    运用演示:

    if多分支中实现不同成绩不同评价的案例 

     

    1. #!/bin/bash
    2. read -p "请输入你的分数(0~100):" num
    3. case $num in
    4. 100)
    5. echo "优秀"
    6. ;;
    7. [89][0-9])
    8. echo "良好"
    9. ;;
    10. [67][0-9])
    11. echo "及格"
    12. ;;
    13. [0-9]|[1-5][0-9])
    14. echo "继续努力!"
    15. ;;
    16. *)
    17. echo "输入有误,请输入 0~100 的范围!"

     

    结果测试:

     

     

     总结

    1. 引用变量字符串时,给变量加上引号,避免引起歧义

    2.awk  进行浮点运算时,被赋值的变量,应用用单引号

    3. 多条件需要不同结果时,可以运用多分支if来解决。

    4.合理利用if语句,嵌套过多的if语句,影响代码运行的速率。

    5.注意代码的格式,便于维护和优化

  • 相关阅读:
    uniapp 小程序实现图片宽度100%、高度自适应的效果
    面试:ThreadLocal
    阿里巴巴java开发手册-编程规约
    Android显示系统-GraphicBuffer和Gralloc分析
    [附源码]计算机毕业设计springboot基于Web的绿色环保网站
    【Vue面试题】说说nextTick的使用和原理?
    c++的概述(二)
    Spring的Factories机制介绍
    table的宽高适配方法
    Linux系统编程——网络编程的学习
  • 原文地址:https://blog.csdn.net/qq_62462797/article/details/126511591