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}充值成功!\n目前您的余额为$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(服务启动脚本)。
·····································································································································
因小柏目前水平有限,正在努力学习中,写的不好,路过的大佬多多指教,谢谢。