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

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

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

最新文章

  1. 配置 LBaaS - 每天5分钟玩转 OpenStack(121)
  2. 【JUC】JDK1.8源码分析之SynchronousQueue(九)
  3. MongoDB学习笔记~为IMongoRepository接口添加分页取集合的方法
  4. nginx限制单个IP访问配置
  5. python基础:三元运算
  6. Java 并发专题 : Timer的缺陷 用ScheduledExecutorService替代
  7. OracleParameter 的使用(参数名要以:开头,不允许包含@等特殊字符)[转]
  8. 做ie8css样式时浏览器默认杂项模式遇到的一个小坑
  9. response对象的使用
  10. Js表单验证控件(使用方便,无需编码)-01使用说明
  11. ES6 系列之 Babel 是如何编译 Class 的(下)
  12. [JavaScript] canvas 合成图片和文字
  13. 09_java基础——this
  14. Windows FFMPEG开发环境配置
  15. secureCRT连接linux系统
  16. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(三十):使用flatMapGroupsWithState替换agg
  17. CSS属性大全
  18. 成为JAVA架构师必看书籍推荐
  19. javascript:类数组 -- 对象
  20. IT简历

热门文章

  1. spring boot多数据源配置(mysql,redis,mongodb)实战
  2. 利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)
  3. 不规范的json文档 转化成 java 对象的处理
  4. Jmeter连接Redis,获取Redis数据集
  5. Html5游戏开发-图形与动画(一)
  6. Android Studio 使用Toast
  7. [日常] HTTP的媒体类型
  8. 详解-制作根文件系统,并使用yaffs,jffs,nfs挂载系统(2)
  9. devtools进行热部署
  10. Java学习笔记之——自动装箱与拆箱