zoukankan      html  css  js  c++  java
  • shell的while和until 的用法

    shell while循环工作中使用的不多,一般适用于守护进程程序或始终循环执行场景,其他循环计算等。

    while条件句:

    语法:

    while 条件
             do
              指令…
    done

     ok,我们测试一下:

    测试:每隔2秒屏幕输出系统负载值。

    [root@bqh-118 scripts]# vim while.sh 
    while true    #条件为真时,也可以用 "[1]"代替
    do
      uptime      #查看系统负载情况
      sleep 2     #2秒后
    done

    提示:while true 表示条件永远为真,因此会一直运行,像死循环一样,每隔2秒查看一下系统负载情况,但我们称呼为守护进程。

    接下来我们来一个稍微难一点的:计算从1+到100之和(1+2+3+4+......100)的方法

    [root@bqh-118 scripts]# vim while1_100sum.sh 
    #!/bin/sh
    #no.1
    i=1
    sum=0
    while [ $i -le 100  ]  #当i小于100时,往下执行
    do
     ((sum=sum+i))         #sum+变量i
     ((i++))               #执行一次循环i+1,直到条件不成立为止。
    done
    echo $sum              #输出总和sum
    #no.2                        #数据公式计算 
    a=100
    ((sum=a*(a+1)/2))
    echo $sum

    更多方法详情去:https://blog.51cto.com/oldboy/767862

    ================================================================

    until循环语句:until应用场景不多。(属于先执行后判断,类似于先上车,后补票。)

    语法:

    until 条件
             do
              指令...
    done

    测试:

    [root@bqh-118 scripts]# vim while1_100sum.sh 
    #!/bin/sh
    a=5
    until [[ $a < 1 ]]  #当a不小于1时,执行循环,注意判断是单[]须转义加或用其他方法
    do
      echo "My name is bqh!"
      ((a--))                  #执行一次循环变量a递减一次
    done

    提示:以上语句中5<1不成立那么就开始循环,直到小于1时停止,注意要用"[[]]"或"-lt"判断

    ok,我们来调整一个实战测试吧:

    1、编写手机业务一键服务脚本

      1 [root@bqh-118 scripts]# vim sjyjcx.sh 
      2 #!/bin/sh
      3 #date:2019-04-25
      4 #author:aゞ锦衣卫
      5 #script function:Mobile phone recharge query service
      6 menu() {          #定义菜单函数
      7  cat <<bqh
      8 ==========================================
      9     Mobile phone recharge query service   
     10 ------------------------------------------
     11      1.话费充值                           
     12      2.余额查询                           
     13      3.发送短信                           
     14      4.退出服务                           
     15                          
     16                          author:aゞ锦衣卫
     17                          date:2019-04-25  
     18 ==========================================
     19 bqh
     20 }
     21 
     22 TOTAL=0      #定义总额
     23 MSG=1        #定义一条短信1元
     24 green='e[1;32m'       #绿色
     25 red='e[1;31m'         #红色
     26 yelow='e[1;33m'       #黄色
     27 shan='e[31;5m'        #闪烁红
     28 res='e[0m'            #清除颜色
     29 
     30 judge() {     #定义判断函数
     31  read -p "请输入您要办理的业务:" num
     32  expr $num + 1 &>/dev/null
     33    if [ "$?" -ne 0 ];then
     34       echo -e "${shan}请您输入{1|2|3|4}${res}"
     35       exit
     36    fi
     37 }
     38 
     39 recharge() {     #定义充值话费函数
     40  while  :
     41   do
     42    read -p "请输入您要充值的金额:" a
     43    expr $a + 1 &>/dev/null           #检测变量a是否为整数
     44    if [ "$?" -ne 0 ];then
     45         echo -e "${shan}充值失败!${res}"
     46         echo -e "${shan}请输入数值!${res}"
     47         exit 2
     48    else
     49         ((TOTAL+=a)) && echo "充值中....." && sleep 1
     50         echo -e "${green}充值成功!
    目前您的余额为$TOTAL元!${res}"    
     51         return 1   #退出当前函数
     52    fi
     53   done
     54 }
     55 
     56 query() {   #定义查询余额函数
     57    echo -e "${green}您好!您当前的余额为:$TOTAL元${res}"
     58 }
     59 
     60 sending_sms() {   #定义发送短信函数
     61    if [ "$TOTAL" -lt "$MSG" ];then   #判断是否有足够的钱支持本次发送短信服务
     62         echo -e "${shan}很抱歉,由于您余额不足本次发送,请您及时充值。${res}"
     63    else
     64         read -p "请输入您要发送的内容:" txt
     65         read -p "您确定是否发送?{y/n}" select
     66 case "$select" in     #判断用户最终是否确定发送短信
     67         [yY]|[yY][eE][sS])
     68         echo -e "${yelow}$txt${res}"&& echo "正在发送......"
     69         sleep 1
     70         echo -e "${green}发送成功!${res}"
     71 ;;
     72         [nN]|[nN][oO])
     73         echo -e "${green}取消发送!${res}"
     74 ;;
     75         *)
     76         echo -e "${shan}很抱歉,由于您操作有误,暂不支持本次发送!${res}"
     77 ;;
     78 esac
     79    fi
     80 }
     81 
     82 server() {   #定义办理业务函数
     83 while :
     84 do
     85   menu && judge
     86     case "$num" in     根据用户输入的变量num,并给出相应的服务。
     87         1)       
     88         recharge
     89 ;;
     90         2)
     91         query
     92 ;;
     93         3)
     94         sending_sms
     95 ;;
     96         4)
     97         echo -e "${green}感谢您使用一键查询服务。${res}"
     98         exit 177
     99 ;;
    100 
    101         *)
    102         echo -e "${shan}请您输入{1|2|3|4}${res}"
    103         exit 188
    104 ;;
    105      esac
    106 done
    107 }
    108 server     #调用办理业务函数

    执行效果如下:

     ------------------------------------------------------------------------------------------------------------------------------------

    各语句常用于场景:

    条件表达式:简单的判断(文件是否存在/字符串是否为空等等)

    if语句:取值判断,不同值数量较少的情况

    while:守护进程、无限循环(sleep)

    case:服务启动脚本、菜单等

    for:正常的循环处理,最常用。

    while 循环总结:

    1、while 循环的特征是执行守护进程以及我们希望可持续执行的环境,用于频率小于1分钟的循环处理,其他的while循环几乎都可以被for循环代替。

    2、几乎所有的case语句都可以用if语句代替,case语句常用于系统脚本启动,其他普通判断多用于if语句。

    3、if和for语句最常用,其次while(守护进程)和case(服务启动脚本)。

    ·····································································································································

    因小柏目前水平有限,正在努力学习中,写的不好,路过的大佬多多指教,谢谢。

  • 相关阅读:
    Python学习32天(socket、tcp协议)
    Python学习第31天(异常、异常捕捉)
    Python之旅的第30天(过程记录,选课系统的基本实现)
    Python之旅的第29天(property补充、元类和自定义元类)
    Python之旅的第28天(描述符、类的装饰器)
    Python之旅的第27天(复习、习题实现、__enter__、__exit__)
    Python之旅第26天(__slots__等内置方法、软件开发规范)
    假期第二周
    假期第一周
    第十六周学习进度博客
  • 原文地址:https://www.cnblogs.com/su-root/p/10765286.html
Copyright © 2011-2022 走看看