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一览$*所有参数列表 ...
随机推荐
- Mybatis源码解析-MapperRegistry代理注册mapper接口
知识储备 SqlsessionFactory-mybatis持久层操作数据的前提,具体的解析是通过SqlSessionFactoryBean生成的,可见>>>Spring mybat ...
- MySQL的binlog恢复(Windows下)
前言 在最近的工作中,由于自己粗(zuo)心(si)误update操作导致几百行的数据出现错误,在心急如焚的同时(那时候我竟然不知道除了备份之后还有binlog日志恢复)立马查资料学习binlog的恢 ...
- python模块之shutil
shutil是一个用于简化文件操作的模块. 复制文件(传入源文件对象和目标文件对象) import shutil f1 = open(r'/Users/jingxing/PycharmProjects ...
- Javascript 组合继承 原型链继承 寄生继承
Javascript继承通常有三种方式. 第一种:组合式继承: function SuperType(name) { this.name = name; this.colors = ["re ...
- [转]VS2015 Cordova Ionic移动开发(一)
本文转自:https://www.cnblogs.com/UltimateAvalon/p/5328642.html 一.Windows环境配置 1.如果已经安装VS2015,打开[工具]-[选项]找 ...
- [转]图解Docker容器和镜像
本文转自:https://www.cnblogs.com/wangqiaomei/p/5818636.html 图解Docker容器和镜像 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器 ...
- H5 五子棋源码
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- mysql 关联查询技巧
废话不多说,直接进入正题 #数据准备 班级表class: CREATE TABLE `class` ( `class_no` ) unsigned zerofill NOT NULL AUTO_INC ...
- bash array
bash 仅支持一维数组. 而且数组下标是从0开始的为数组赋值:array=(1 4 7 2 5 8) #以空格为分割符,()为数组str="this is test string& ...
- 怎么打开在.bashrc文件以及设置颜色
打开/etc/bashrc,加入如下一行: alias ls="ls --color" 下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了,其中不同颜 ...