运维开发网

while循环和until循环

运维开发网 https://www.qedev.com 2020-11-28 12:06 出处:51CTO 作者:贫僧加菲
1、循环语句:循环语句命令常用于重复执行一条命令或者一组命令,直到不结果不在满足循序条件时停止。2、常见循环语句:while、until、for以及select3、while循环语句的语法while<条件表达式>do命令done说明;while后面紧跟条件表达式,如果表达式满足,则执行do后面的命令,当执行到done时,会在重复判断条件表达式,是否满足,如果满足继续执行do后面的命令,

1、循环语句:

循环语句命令常用于重复执行一条命令或者一组命令,直到不结果不在满足循序条件时停止。

2、常见循环语句:

while、until、for以及select

3、while循环语句的语法

            while <条件表达式>
                do
                        命令
            done

说明;while后面紧跟条件表达式,如果表达式满足,则执行do后面的命令,当执行到done时,会在重复判断条件表达式,是否满足,如果满足继续执行do后面的命令,直到不再满足条件表达式

3、until循环语句的语法

        until <条件表达式>
            do
                    命令
        done

说明:until用法与while用法类似,唯一的区别是,until循环是在条件表达式不成立的时候,进入do循环,如果成立则终止循环。

4、while循环基本实例

1、每个2秒钟,输出一次系统负载情况

        while true  #true表示永远为真,在这里无论循环多少次,条件表达式一直成立
                do  
                    uptime      #显示系统负载
                    sleep 2     #每2秒循序一次循环体
            done
    ```

2、通过while循环输出987654321

#!/bin/bash

a=9

while ((a>0))

do

echo "$a"

((a--))

done

同样可以用until实现

#!/bin/bash

a=9

until ((a<1))

do

echo "$a"

((a--))

done

用until时,就是当变量a的值小于1成立时,终止循环

5、手机充值,每发送一条短信减掉1角5分钱,如果低于1角5分,提示余额不足,请充值

        #!/bin/bash
            sen_num=15                #定义余额变量,初始值15
            fre_num=15                  #定义每条短信使用金额为15
            total=0                          #定义发送次数变量,初始值为0次
            . /etc/init.d/functions                        #调用系统函数库
            function change () {                          #定菜单选择函数
            echo '

            ===================================
            1.充值
            2.发送短信
            3.查询余额
            4.退出

            ===================================
            '
            }
            function  chong () {                           #定义充值函数
                read -p "请输入充值金额:" pice             #read读取用户输入的金额
                expr $pice + 1 &>/dev/null                       #判断用户输入的金额是否为整数
                if [ $? -ne 0 ] ;then
                    echo "请输入正确的数值!"
                else    
                     sen_num=$((sen_num+pice))                  #余额增加
                     echo "当前可用余额:$sen_num"
                fi
            }
            function jixu () {                              #定义询问用户是否继续发送短信函数
                                read -p "请问是否继续发送短信(yes|no):" A
                             case $A in
                                            Y|yes)
                                            send
                                            ;;
                                            N|no)
                                            main
                                            ;;
                                            *)
                                            echo "Input yes or no"
                esac
            }
            function send () {                                #定义发送短信函数
                if [ $sen_num -le $fre_num  ] ; then                    #判断余额是否充足
                 printf "当前可用余额不足,请及时充值。\n"
                else
                while true
                do
                read -p "请输入短信内容:" content               #read读取用户输入的短信内容
                sen_num=$((sen_num-fre_num))
                printf  "SMS sent successfully!!!\n"
                ((total=total+1))                      #每发送成功一次,发送次数加1
                last=$((sennum/frenum))         #计算余额可发送多少条短信
                printf "您已发送$total条短信!剩余$last!\n"   
                jixu        #调用是否继续函数
                if [ $sen_num -lt $fre_num ] ; then       #判断可用余额情况
                    echo "余额不足,请充值!"
                    return 1
                fi
                    done
            fi
            }
            function main () {                          #定义主函数
                while  true 
                do
                change                                        #调用菜单函数
                read -p  "请选择你要操作的数字:" men           #read读取用户选择的菜单数字
                case $men in                                          #判断数字,对应调用函数
                1)
                 chong
                ;;
                2)
                send
                jixu
                ;;
                3)
                printf "当前可用余额$sen_num"
                ;;
                4)
                exit 0
                ;;
                *)
                printf "输入错误,请输入{1|2|3|4}\n"
                esac
            done
            }
            main                            #调用主函数运行
### 6、while循环每个10秒确定网站是否正常
            #!/bin/bash
            . /etc/init.d/functions               #调用系统函数库
            total1=0    #定义次数变量
             total () {     #设置次数函数
                            ((total1++))
                            if [ "$total1" -ge 2 ] ;then                  #判断执行次数是否大于等2次
                            exit 0
                            fi
            }

            if  [ $# -ne  1 ];then                           #判断参数个数是否正确
                printf  "usage:$0 web_url \n"
                exit 1
            fi

            while  true
                 do
                wget --spider --timeout 5 --tries=2 -qr $1            #通过wget命令判断网站
                if  [  $?  -eq   0  ];then                              #返回状态值是否为0
                action "$1 is ok"  /bin/true                      #如果是,则表示网站正确
                #exit 1
                else 
                action "$1 is no"  /bin/false                       #否则失败
                fi
                sleep 3     #每个3秒循环一次
                total                 #调用次数函数,判断循环次数,如果超过2次,则退出脚本
            done
### 7、while循环按行读取文件的方式:
1、通过exec读取

            exec <file
                        while read line
                            do
                                命令
                        done
2、通过cat命令加管道读取文件

                cat file|while read line ;do
                                                        命令
                                            done

3、通过while结尾done输入重定向读取文件

            while read line
                        do
                                命令
                    done <file

实例:读取Nginx或者Apache日志文件,每行的访问字节数对应的数字,并计算出总和
            #!/bin/bash
            sum=0                               #定义字节数总和变量,初始值0
            exec <$1                          #通过exec命令读取文件
            while read line;do              #while循序读行
                size=`echo $line|awk '{print $10}'`              #通过awk命令截取访问字节数列
                expr $size + 1 &>/dev/null                     #判断截取的是否为整数
                if [ $? -ne 0 ];then           #如果不为整数,continue命令则跳过非整数的部分,继续整数的加法计算
                continue
                fi
                ((sum=sum+$size))
            done
            echo "$sum"

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号