• shell流程控制


    1.if条件判断

    1.1单分支if条件
    语法:

    if [ 条件判断式 ]
    	then
    		程序
    fi
    
    • 1
    • 2
    • 3
    • 4

    案例:统计根分区使用率

    vi test1.sh
    #!/bin/bash
    #统计根分区的使用率
    #cut 从一行上一处部分内容,选择性显示
    rate=$(df -h | grep "/dev/vda1" | awk '{print $5}' | cut -d "%" -f1)
    if [ $rate -ge 80 ]
    #判断rate的值如果大于80,则执行then程序
       then
           echo "warning! /dev/vda1 is full"
           #打印警告信息
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    案例:创建目录

    vim test2.sh
    #!/bin/bash
    #创建目录。判断是否存在,存在就结束,反之创建
    echo "当前脚本名称为$0"
    DIR="/media/cdrom"
    if [ ! -e $DIR ]
       then
           mkdir -p $DIR
           echo "$DIR创建完成"
       else
           echo "$DIR已经存在"
    fi
    
    #执行脚本
    [root@tdm1 ~]# bash test3.sh 
    当前脚本名称为test3.sh
    /media/cdrom创建完成
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    1.2双分支if条件语句
    语法:

    if [ 条件判断式 ]
    	then
    		条件成立时,执行的程序
    	else
    		条件不成立时,执行的另一个程序
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    案例:备份数据库

    #!/bin/bash
    #备份mysql数据库
    
    #同步系统时间
    ntpdate asia.pool.ntp.org >> /dev/null 2>&1
    
    #把当前时间按照年月日格式赋值变量
    date=$(date +%y%m%d)
    
    #统计mysql数据库大小,赋值size变量
    size=$(du -sh /usr/local/mysql)
    
    if [ -d /tmp/mysql ]
    #判断备份目录是否存在,是否为目录
      then
       #把当前日期写入临时文件
       echo "Date:$date" > /tmp/mysql/dbinfo.txt
       #把当前数据库大小写入临时文件
       echo "Data size:$size" >> /tmp/mysql/dbinfo.txt
       #进入该目录下
       cd /tmp/mysql
       #打包压缩数据库和临时文件,把产生的输出丢入垃圾箱
       tar -zcf mysql-lib-$date.tar.gz /usr/local/mysql dbinfo.txt >>/dev/dull 2>&1
       #删除临时文件
       rm -rf /tmp/mysql/dbinfo.txt
      else
       #如果判断为假,则建立备份目录 
       #创建目录
       mkdir /tmp/mysql
       #把当前日期写入临时文件
       echo "Date:$date" > /tmp/mysql/dbinfo.txt 
       #把当前数据库大小写入临时文件
       echo "Data size:$size" >> /tmp/mysql/dbinfo.txt
       #进入该目录下
       cd /tmp/mysql
       #打包压缩数据库和临时文件,把产生的输出丢入垃圾箱
       tar -zcf mysql-lib-$date.tar.gz /usr/local/mysql dbinfo.txt >>/dev/dull 2>&1
       #删除临时文件
       rm -rf /tmp/mysql/dbinfo.txt
    fi
    
    ##执行脚本
    [root@tdm1 ~]# ./test4.sh 
    [root@ltdm1 mysql]# pwd
    /tmp/mysql
    [root@tdm1 mysql]# ll
    total 712592
    -rw-r--r--. 1 root root 729693306 Sep 13 01:49 mysql-lib-230913.tar.gz   #备份成功,并且删掉dbinfo.txt文件
    
    • 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

    案例:判断apache是否启动,如果没有则启动

    vim test5.sh
    #!/bin/bash
    #判断httpd是否启动,没有启动就开启
    #统计httpd进程的个数
    count=$(ps -ef | grep httpd | grep -v grep | wc -l)
    #判断进程是否大于0
    if [ $count -gt 0 ]
      then
       #大于0,进程启动
       echo "httpd进程启动"
      else
       #启动httpd进程
       systemctl  start httpd
    fi
    
    ##执行脚本
    [root@tdm2 ~]# ps -ef | grep httpd
    root     13476     1  1 14:04 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
    www      13477 13476  0 14:04 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
    www      13478 13476  0 14:04 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
    www      13479 13476  0 14:04 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
    www      13480 13476  0 14:04 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
    www      13481 13476  0 14:04 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
    root     13574 17106  0 14:04 pts/1    00:00:00 grep --color=auto httpd
    [root@tdm2 ~]# ./test5.sh 
    httpd进程启动
    
    • 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

    1.3多分支if条件语句
    语法:

    vim test6.sh
    if [ 条件判断式1 ]
    	then
    		当条件判断式1成立时,执行程序1
    elif [ 条件判断式2 ]
    	then
    		当条件判断式2成立时,执行程序2
    …省略更多条件…
    else
    	当所有条件都不成立时,最后执行此程序
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    案例:判断用户输入的是什么文件

    #判断用户输入的是什么文件
    
    read -p "Please input a filename: " file
    #接收键盘的输入,并赋予变量file
    if [ -z "$file" ]
    #判断file变量是否为空
            then
                    echo "Error, please input a filename"
                    #如果为空,执行程序1,也就是输出报错信息
                    exit 1
                    #退出程序,并返回值为Ⅰ(把返回值赋予变量$P)
    elif [ ! -e "$file" ]
                    #判断file的值是否存在
                    then
                    echo "Your input is not a file!"
                    #如1果不存在,则执行程序2
                    exit 2
                    #退出程序,把并定义返回值为2
    elif [ -f "$file" ]
                    #判断file的值是否为普通文件
                    then
                    echo "$file  is a regulare file!"
                    #如果是普通文件,则执行程序3
    elif [ -d "$file" ]
                    #到断file的值是否为目录文件
                    then
                    echo "$file is a directory!"
                    #如果是目录文件,网执行程序4
    else
            echo "$file is an other file!"
            #如果以上判断都不是,则执行程序5
    fi
    
    ##执行脚本
    [root@tdm1 ~]# bash test6.sh 
    Please input a filename: abc
    Your input is not a file!
    [root@tdm1 ~]# bash test6.sh 
    Please input a filename: /etc
    /etc is a directory!
    [root@tdm1 ~]# bash test6.sh 
    Please input a filename: test.sh
    test.sh  is a regulare file!
    [root@tdm1 ~]# bash test6.sh 
    Please input a filename: 
    Error, please input a filename
    
    • 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

    2.多分支case条件语句

    case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系
    case语句语法如下:

    
    case $变量名 in
    	"值1")
    	如果变量的值等于值1,则执行程序1
    	;;
    	"值2")
    	如果变量的值等于值2,则执行程序2
    	::
    	…省略其他分支…
    	*)
    	如果变量的值都不是以上的值,则执行此程序
    	;;
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    这个语句需要注意以下内容:

    • case语句,会取出变量中的值,然后与语句体中的值逐一比较。如果数值符合,则执行对应的程序,如果数值不符,则依次比较下一个值。如果所有的值都不符合,则执行 “*)” (*代表所有其他值)中的程序。
    • case语句以“case”开头,以“esac”结尾。
    • 每一个分支程序之后要通过“;;”双分号结尾,代表该程序段结束(千万不要忘记,每次写case语句,都不要忘记双分号)。

    案例:

    vim test7.sh
    #!/bin/bash
    read -p "请输入一个字符,并按Enter确认:" KEY
    case "$KEY" in
            [a-z]|[A-Z])
            echo "您输入的是字母"
            ;;
    
            [0-9])
            echo "您输入的是数字"
            ;;
    
            *)
            echo "您输入的是其他字符"
            ;;
    esac   
    
    ##执行脚本
    [root@tdm1 ~]# bash test7.sh 
    请输入一个字符,并按Enter确认:a
    您输入的是字母
    [root@tdm1 ~]# bash test7.sh 
    请输入一个字符,并按Enter确认:1
    您输入的是数字
    [root@tdm1 ~]# bash test7.sh 
    请输入一个字符,并按Enter确认:#
    您输入的是其他字符
    
    • 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
  • 相关阅读:
    Shopee店铺没有流量?3步教你如何诊断店铺
    【DevPress】V2.4.1版本发布,增加抽奖组件
    QTableWidget常用属性
    深度学习概念(术语):Fine-tuning、Knowledge Distillation, etc
    JAVA多线程并发(一):线程的创建
    百度强推并发编程笔记我爱了,原来这才叫并发
    了解什么是JDBC
    VScode(1)之内网离线安装开发环境(VirtualBox+ubuntu+VScode)
    websocket多线程发送消息报错TEXT_PARTIAL_WRITING--自旋锁替换synchronized独占锁的使用案例
    LearnOpenGL 及 ShaderToy 的 CMake 构建框架
  • 原文地址:https://blog.csdn.net/m0_71163619/article/details/132844852