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、编写手机业务一键服务脚本
[root@bqh-118 scripts]# vim sjyjcx.sh
#!/bin/sh
#date:2019-04-25
#author:aゞ锦衣卫
#script function:Mobile phone recharge query service
menu() { #定义菜单函数
cat <<bqh
==========================================
Mobile phone recharge query service
------------------------------------------
1.话费充值
2.余额查询
3.发送短信
4.退出服务 author:aゞ锦衣卫
date:2019-04-25
==========================================
bqh
} TOTAL=0 #定义总额
MSG=1 #定义一条短信1元
green='\e[1;32m' #绿色
red='\e[1;31m' #红色
yelow='\e[1;33m' #黄色
shan='\e[31;5m' #闪烁红
res='\e[0m' #清除颜色 judge() { #定义判断函数
read -p "请输入您要办理的业务:" num
expr $num + 1 &>/dev/null
if [ "$?" -ne 0 ];then
echo -e "${shan}请您输入{1|2|3|4}${res}"
exit
fi
} recharge() { #定义充值话费函数
while :
do
read -p "请输入您要充值的金额:" a
expr $a + 1 &>/dev/null #检测变量a是否为整数
if [ "$?" -ne 0 ];then
echo -e "${shan}充值失败!${res}"
echo -e "${shan}请输入数值!${res}"
exit 2
else
((TOTAL+=a)) && echo "充值中....." && sleep 1
echo -e "${green}充值成功!\n目前您的余额为$TOTAL元!${res}"
return 1 #退出当前函数
fi
done
} query() { #定义查询余额函数
echo -e "${green}您好!您当前的余额为:$TOTAL元${res}"
} sending_sms() { #定义发送短信函数
if [ "$TOTAL" -lt "$MSG" ];then #判断是否有足够的钱支持本次发送短信服务
echo -e "${shan}很抱歉,由于您余额不足本次发送,请您及时充值。${res}"
else
read -p "请输入您要发送的内容:" txt
read -p "您确定是否发送?{y/n}" select
case "$select" in #判断用户最终是否确定发送短信
[yY]|[yY][eE][sS])
echo -e "${yelow}$txt${res}"&& echo "正在发送......"
sleep 1
echo -e "${green}发送成功!${res}"
;;
[nN]|[nN][oO])
echo -e "${green}取消发送!${res}"
;;
*)
echo -e "${shan}很抱歉,由于您操作有误,暂不支持本次发送!${res}"
;;
esac
fi
} server() { #定义办理业务函数
while :
do
menu && judge
case "$num" in 根据用户输入的变量num,并给出相应的服务。
1)
recharge
;;
2)
query
;;
3)
sending_sms
;;
4)
echo -e "${green}感谢您使用一键查询服务。${res}"
exit 177
;; *)
echo -e "${shan}请您输入{1|2|3|4}${res}"
exit 188
;;
esac
done
}
server #调用办理业务函数
执行效果如下:



------------------------------------------------------------------------------------------------------------------------------------
各语句常用于场景:
条件表达式:简单的判断(文件是否存在/字符串是否为空等等)
if语句:取值判断,不同值数量较少的情况
while:守护进程、无限循环(sleep)
case:服务启动脚本、菜单等
for:正常的循环处理,最常用。
while 循环总结:
1、while 循环的特征是执行守护进程以及我们希望可持续执行的环境,用于频率小于1分钟的循环处理,其他的while循环几乎都可以被for循环代替。
2、几乎所有的case语句都可以用if语句代替,case语句常用于系统脚本启动,其他普通判断多用于if语句。
3、if和for语句最常用,其次while(守护进程)和case(服务启动脚本)。
·····································································································································
因小柏目前水平有限,正在努力学习中,写的不好,路过的大佬多多指教,谢谢。
shell的while和until 的用法的更多相关文章
- [记录]Shell中的getopts和getopt用法
Shell中的getopts和getopt用法 1.getopts getopts(shell内置命令)不能直接处理长的选项(如:--prefix=/home等),getopts有两个参数,第一个参数 ...
- (转)轻松掌握shell编程中数组的常见用法及示例
缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助.其实SHELL的数组很简单,好用.我们学习 ...
- Shell中的(),{}几种语法用法-单独总结
shell中的(),{}几种语法用法 查看脚本语法是否有错误: bash -n modify_suffix.sh 跟踪执行 sh -x modify_suffix.sh aaa 1. ${var} 2 ...
- Linux shell中&,&&,|,||的用法
前言 在玩dvwa的命令注入漏洞的时候,遇到了没有预料到的错误,执行 ping 127.0.0.1 & echo "<?php phpinfo(); ?>" & ...
- 发现linux shell中$0,$?,$!等的特殊用法
记录下linux shell下的特殊用法及参数的说明 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代 ...
- Linux定时对日志批量打包Shell脚本及定时任务crontab 详细用法
一.需求背景 因此次项目的生产环境中部署了多套系统,每天会产生大量的日志(数百GB的量),侵占了服务器宝贵的存储资源空间.为了有效缓解服务器存储压力,考虑通过Linux的Shell脚本结合cr ...
- linux shell中$0,$?,$!等的特殊用法
记录下linux shell下的特殊用法及参数的说明 变量说明: $$Shell本身的PID(ProcessID)$!Shell最后运行的后台Process的PID$?最后运行的命令的结束代码(返回值 ...
- Shell基础(五):sed基本用法、使用sed修改系统配置、sed多行文本处理、sed综合脚本应用
一.sed基本用法 目标: 本案例要求熟悉sed命令的p.d.s等常见操作,并结合正则表达式,完成以下任务: 1> 删除文件中每行的第二个.最后一个字符 2> 将文件中每行的第一个. ...
- shell中echo基础及高级用法详解-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年2月19日 1.1 基础用法 echo命令用来输出文本,在shell脚本中用来输出提示信息用的比较多. 单引号:原样输出所有的内容,不用转义就能输出特殊 ...
- shell中$0,$?,$!等的特殊用法
变量说明: $$Shell本身的PID(ProcessID)$!Shell最后运行的后台Process的PID$?最后运行的命令的结束代码(返回值)$-使用Set命令设定的Flag一览$*所有参数列表 ...
随机推荐
- Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
应用场景 前两天我们已经介绍了两种Spring Cloud Stream对消息失败的处理策略: 自动重试:对于一些因环境原因(如:网络抖动等不稳定因素)引发的问题可以起到比较好的作用,提高消息处理的成 ...
- Spark学习(一)
一.启动Spark 1.standalone模式 方法一: (1)启动主节点 ./sbin/start-master.sh 访问http://127.0.0.1:8080,得到如下页面 注意标记到的链 ...
- 使用LINQ生成Where的SQL语句
实例1-使用实例-单个语句: ; List<, , }; List<User_info> userInfoList = UserCenterBus.Select_WebSiteBas ...
- MVC学习之路(1) EF 增删查改合集
首先再Model中创建一个类[WMBlogDB] public class WMBlogDB : DbContext { //连接字符串. public WMBlogDB() : base(" ...
- ife 零基础学院 day 1 - 我为什么想学前端
与前端结缘 我是后端研发,毕业四年,用了四年C#,一开始写ASP.NET,有时会在asp页面写简单的js和html,做点css样式调整.当时的感触是前端调试太费劲了,因为没有js.html.css ...
- 【Tomcat】Tomcat的类加载机制
在Tomcat中主要有以下几种类加载器:(图片来自网络) tomcat启动时,会创建几种类加载器: 1 Bootstrap 引导类加载器 加载JVM启动所需的类,以及标准扩展类,位于jre/lib/e ...
- JS 操作svg画图
背景: 一共有3个文件:svg文件,html文件,js文件. 有一个svg图,使用embed标签,引入到了html文件中 svg文件: <svg width="640" he ...
- Js 控制随机数概率
如: 取 1~10 之间的随机数,那么他们的取值范围是: 整数 区间 概率 1 [0,1) 0.1 2 [1,2) 0.1 3 [2,3) 0.1 4 [3,4) 0.1 5 [4,5) 0.1 6 ...
- javascript中call()、apply()的区别
call().apply()的区别: 相同点: 1.call()和apply()都可以用来间接调用函数,都可以显式调用所需的this.即,锚点滑动任何函数可以作为任何对象的方法来调用. 2.两个方法都 ...
- Django之Ajax文件上传
请求头ContentType ContentType指的是请求体的编码类型,常见的类型共有3种: 1 application/x-www-form-urlencoded(看下图) 这应该是最常见的 P ...