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(服务启动脚本)。

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

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

原文地址:https://www.cnblogs.com/su-root/p/10765286.html