zoukankan      html  css  js  c++  java
  • Linux学习笔记(18) Shell编程之流程控制

    1. if语句

    (1) 单分支if条件语句

    格式为:

    # 注意条件判断式两端的空格
    if
    [ 条件判断式 ];then 程序员 fi 或者 if[ 条件判断式 ] then 程序 fi

     例:判断分区使用率

    #!/bin/bash
    
    #获取根分区的使用率
    rate=$(df -h | grep "/dev/sda5" | awk '{print $5}' | cut -d "%" -f 1)
    
    if [ $rate -ge 10 ]
        then
            echo "/dev/sda5 is over 10%!!"
    fi

      (2) 双分支if条件语句

      格式为:

    if [ 条件判断式 ]
        then
            条件成立时,执行的程序
        else
            条件不成立时,执行的另一个程序
    fi

    例1:备份/etc目录(同样适用于实际情况中的mysql备份)

    #!/bin/bash
    #备份mysql数据库
    #Author :
    
    #同步系统时间
    #ntpdate asia.pool.ntp.org &> /dev/null
    #把当前系统时间按照"年月日"格式赋予变量date
    date=$(date +%y%m%d)
    #统计mysql数据库的大小,并将其赋予size变量
    size=$(du -sh /etc)
    
    if [ -d /tmp/dbbak ]
        then
            echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
            echo "Date size : $size" >> /tmp/dbbak/dbinfo.txt
            cd /tmp/dbbak
            tar -zcf etc_$date.tar.gz /etc dbinfo.txt &> /dev/null
            rm -rf /tmp/dbbak/dbinfo.txt
        else
            mkdir /tmp/dbbak
            echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
            echo "Date size : $size" >> /tmp/dbbak/dbinfo.txt
            cd /tmp/dbbak
            tar -zcf etc_$date.tar.gz /etc dbinfo.txt &> /dev/null
            rm -rf /tmp/dbbak/dbinfo.txt
    fi

    例2:判断apache是否启动

    #!/bin/bash
    #Author : 
    
    #使用nmap命令扫描服务器(-sT表示扫描指定服务器上开启的TCP端口),并截取apache服务的状态,赋予变量port
    port=$(nmap -sT 192.168.1.155 | grep tcp | grep http | awk '{print $2}')
    
    if [ "$port"=="open" ]
        then
            echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log
        else
            /etc/rc.d/init.d/httpd start &> /dev/null
            echo "$(date) restart httpd!!" >> /tmp/autostart-err.log
    fi

    (3) 多分支if条件语句

    格式为:

    if [ 条件判断式1 ]
        then
            当条件判断式1成立,执行程序1
    elif [ 条件判断式2 ]
        then 
            当条件判断式2成立时,执行程序2
    ...省略更多条件...
    else
        当所有条件都不成立时,最后执行此程序
    fi

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

    #!/bin/bash
    
    #接收键盘收入,并赋予变量file
    read -p "Please input a filename: " file
    
    if [ -z file ]    #判断file变量是否为空
        then
            echo "Error,please input a filename"
            exit 1
    elif [ ! -e "$file" ]    #判断file的值是否存在
        then
            echo "Your input is not a file!"
            exit 2
    elif [ -f "$file" ]     #判断file的值是否为普通文件
        then
            echo "$file is a regulare file!"
    elif [ -d "$file" ]
        then
            echo "$file is a directory!"
    else
            echo "$file is an other file!"
    fi

    输出结果:

    [root@localhost sh]# ./if4.sh 
    Please input a filename: 
    Your input is not a file!
    [root@localhost sh]# echo $?
    2
    
    [root@localhost sh]# ./if4.sh 
    Please input a filename: /root
    /root is a directory!

    2. case语句

    case语句和if...elif...fi语句一样都是多分支条件语句,不过case语句只能判断一种条件关系,而if语句可以判断多种条件关系

    case的格式为:

    case $变量名 in
        "值1")
            如果变量的值等于值1,则执行程序1
            ;;
        "值2")
            如果变量的值等于值2,则执行程序2
            ;;
        ...省略其他分支...
        *)
            如果变量的值都不是以上的值,则执行此程序
            ;;
    esac

    例:判断用户输入

    [root@localhost sh]# vi case1.sh

    #!/bin/bash read -p "Please choose yes/no: " -t 30 cho case $cho in "yes") echo "Your choose is yes!" ;; "no") echo "Your choose is no!" ;; *) echo "Your choose is error!" ;; esac

    输出结果:

    [root@localhost sh]# chmod 755 case1.sh 
    [root@localhost sh]# ./case1.sh Please choose yes/no: yes Your choose is yes! [root@localhost sh]# ./case1.sh Please choose yes/no: no Your choose is no! [root@localhost sh]# ./case1.sh Please choose yes/no: ls Your choose is error!

    3. for循环

    Linux中的for循环有多种语法格式:

    格式1:
    for 变量 in 值1 值2 值3
        do
            程序
        done 

    例1:打印时间及输出结果

    [root@localhost sh]# vi for1.sh
    #!/bin/bash
    
    for time in morning afternoon evening
        do
            echo "This time is $time"
        done
    
    
    [root@localhost sh]# chmod 755 for1.sh 
    [root@localhost sh]# ./for1.sh 
    This time is morning
    This time is afternoon
    This time is evening

    例2:批量解压缩

    [root@localhost sh]# vi for2.sh
    #!/bin/bash
    
    cd /tmp
    ls *.tar.gz > ls.log
    for i in $(cat ls.log)
        do 
            tar -zxf $i &> /dev/null
        done
    
    rm -rf /tmp/ls.lo
    格式2:
    for (( 初始值;循环控制;变量变化 ))
        do
            程序
        done 

    例1:从1加到100,并显示输出结果

    [root@localhost sh]# vi for3.sh
    #!/bin/bash
    
    s=0
    for(( i=0;i<=100;i=i+1 ))
        do
            s=$(( $s + $i ))
        done
    
    echo "The sum of 1+2+..+100 is : $s"
    
    [root@localhost sh]# chmod 755 for3.sh 
    [root@localhost sh]# ./for3.sh 
    The sum of 1+2+..+100 is : 5050

    注:两种for的区别在于是否事先知道处理的个数,如果知道,执行第二种for语法,否则执行第一种语法

    例2:批量添加指定数量的用户

    [root@localhost sh]# vim for4.sh 
    #!/bin/bash
    #Author:
    
    read -t 30 -p "Please input username:" name
    read -t 30 -p "Please input the number of users:" num
    read -t 30 -p "Please input the passed of users:" pass
    if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
        then
            y=$(echo $num | sed 's/^[0-9]*$//g')
            if [ -z "$y" ]
                then
                    for(( i=1;i<=$num;i=i+1 ))
                        do
                            /usr/sbin/useradd $name$i &> /dev/null
                            echo pass | /usr/bin/passwd --stdin $name$i &> /dev/null
                        done
            fi
    fi

    执行结果:

    [root@localhost sh]# cat /etc/passwd
    ......
    user1:x:501:503::/home/user1:/bin/bash
    user2:x:502:504::/home/user2:/bin/bash

    4. while循环与until循环

    (1) while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这就和for的固定循环不太一样,其格式为:

    while [ 条件表达式 ]
        do
            程序
        done

    例1:从1加到100

    [root@localhost sh]# vim while1.sh 
    #!/bin/bash
    #Author:
    
    s=0
    i=1
    while [ $i -le 100 ]
        do
            s=$(( $s + $i ))
            i=$(( $i + 1 ))
        done
    
    echo "The sum is : $s"

    (2) until循环和while循环相反。until循环只要条件判断式不成立则进行循环,并执行循环程序。一旦条件判断式成立,则循环终止,其格式为:

    until [ 条件判断式 ]
        do
            程序
        done

    例:从1加到100

    [root@localhost sh]# vim while1.sh 
    #!/bin/bash
    #Author:
    
    s=0
    i=1
    until [ $i -gt 100 ]
        do
            s=$(( $s + $i ))
            i=$(( $i + 1 ))
        done
    
    echo "The sum is : $s"

     

     

  • 相关阅读:
    系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路
    微阵列杂交(Microarray Hybridization)
    autocad2018安装笔记
    java基础 大数类
    leetCode 23
    java语言基础 String类
    定时任务cronie
    Linux-vim使用操作大全
    计网期末复习题目
    操作系统期末复习题
  • 原文地址:https://www.cnblogs.com/mengrennwpu/p/4676752.html
Copyright © 2011-2022 走看看