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一览$*所有参数列表 ... 
随机推荐
- mysql连续聚合
			连续聚合是按时间顺序对有序数据进行聚合的操作. 在下面的救示例中将使用EmpOrders表,该表用于存放每位员工每月发生的订购数量. 运行如下 代码创建EmpOrders表并填充示例数据. CREAT ... 
- Ubuntu 安装网卡驱动
			搭建Linux平台的无线热点,需要无线网卡和驱动都要支持 AP. 试了下Ubuntu平台默认驱动并不支持AP模式,所以需要更换驱动,具体操作步骤如下: 1.找到自己网卡芯片的型号,由于我的环境是搭建在 ... 
- Jenkins入门之新建任务
			简单了解了Jenkins界面之后,下面我们简单介绍一下如何使用jenkins创建一个任务.打开Jenkins web管理界面之后,点击左侧最上方的NewItem图标 便会进入如下界面 产生要输入一个构 ... 
- python模块之random
			python的随机数模块为random模块,可以产生随机的整数或浮点数.但是这是伪随机数,python解释器会维护一些种子数,然后根据算法算出随机数.linux维护了一个熵池,这个熵池收集噪音的信息, ... 
- lua的table元类
			Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时, ... 
- 第一册:lesson thirty nine.
			原文: Don't drop it! A:What are you going to do with that vase,Penny? B:I am going to put it on the ta ... 
- C#开发微信公众平台-就这么简单(附Demo)转载
			C#开发微信公众平台-就这么简单(附Demo) 来源:https://www.cnblogs.com/xishuai/p/3625859.html#!comments 写在前面 阅读目录: 服务号和 ... 
- 阿里分布式服务框架Dubbo的架构总结
			Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常简单的模 ... 
- Bean实例化的三种方式
			1. 构造器实例化 spring容器通过bean对应的默认的构造函数来实例化bean. 2. 静态工厂方式实例化 首先创建一个静态工厂类,在类中定义一个静态方法创建实例. 静态工厂类及静态方法: pu ... 
- [转]JS学习总结-技巧、方法、细节
			变量转换 var myVar = "3.14159", str = ""+ myVar,// string类型 int = ~~myVar, // number ... 
