当前位置: 首页 > news >正文

shell编程lesson06

流控制 while 和 until 循环

#!/bin/bash# while-count:display a series of numbersi=1
while [ $i -le 5 ];doecho $ii=$((i+1))
done
echo "Finished!"

while命令的语法结构如下:

while commands;do commands;done

我们可以使用while循环改进上一节中的菜单驱动程序

#!/bin/bash# while-menu: a menu driven system information programDELAY=3 # Number of seconds to display resultswhile [[ $REPLY != 0 ]];doclearcat <<- _EOF_Please Select:1.Display System Information2.Display Disk Space3.Display Home Space Utilization0.Quit_EOF_read -p "Enter selection [0-3] > "if [[ $REPLY =~ ^[0-3]$ ]];thenif [[ $REPLY == 1 ]];thenecho "Hostname: $HOSTNAME"uptimesleep $DELAYfiif [[ $REPLY == 2 ]];thendf -hsleep $DELAYfiif [[ $REPLY == 3 ]];thenif [[ $(id -u) == 0 ]];thenecho "Home Spsce Utilization(All Users)"du -sh /home/*elseecho "Home Space Utilization($USER)"du -sh $HOMEfisleep $DELAYfielseecho "Invalid entry" >&2sleep $DELAYfi
done
echo "Program terminated."

        将菜单封装到while循环内,程序可以在用户每次选择后重复展示菜单项。只要REPLY值不为0,重复循环,展示菜单项,给用户又一次进行选择的机会。

        而在每次动作结束时,系统执行sleep命令使程序暂停几秒,让用户能看到选择执行的结果,随后程序清空屏幕显示并再次展示菜单项。

        一旦REPLY值为0,也就意味着用户选择了推出项,循环终止,程序进一步执行done之后的代码。

跳出循环

bash提供了两种可控制循环内部程序流的内建命令。

break

break命令立即终止循环,程序从循环体后的语句开始执行;

continue

continue命令则会导致程序跳过本次循环剩余的部分,进入下一次新的循环迭代。

#!/bin/bash# while-menu: a menu driven system information programDELAY=3 # Number of seconds to display resultswhile true;doclearcat <<- _EOF_Please Select:1.Display System Information2.Display Disk Space3.Display Home Space Utilization0.Quit_EOF_read -p "Enter selection [0-3] > "if [[ $REPLY =~ ^[0-3]$ ]];thenif [[ $REPLY == 1 ]];thenecho "Hostname: $HOSTNAME"uptimesleep $DELAYcontinuefiif [[ $REPLY == 2 ]];thendf -hsleep $DELAYcontinuefiif [[ $REPLY == 3 ]];thenif [[ $(id -u) == 0 ]];thenecho "Home Spsce Utilization(All Users)"du -sh /home/*elseecho "Home Space Utilization($USER)"du -sh $HOMEfisleep $DELAYcontinuefiif [[ $REPLY == 0 ]];thenbreakfielseecho "Invalid entry" >&2sleep $DELAYfi
done
echo "Program terminated."

        以上版本的菜单驱动构建了一个无限循环,利用true命令向while提供退出状态。因为true退出时状态总为0,所以循环永远也不会停止。这是一个常见的脚本技术。

        因为循环永远也不会自动停止,所以需要程序员提供在适当的时刻跳出循环的方式。当用户选择为0时,脚本使用break命令来终止循环。

        为了使脚本执行更加高效,可以在其他选项执行末端使用continue。在确认用户做出了选择后,continue让脚本跳过了不需要执行的代码。例如,用户选择了1,那么就没必要再验证其他选项了。

until

while命令退出状态不为0时终止循环,而until命令则刚好相反。until命令在退出状态是0的时候终止循环。

#!/bin/bash# until-count:display a series of numberscount=1until [[ $count -gt 5 ]];doecho $countcount=$((count + 1))
done
echo "Finished."

选择使用while还是until,通常取决于哪种循环能够允许程序员写出最明了的测试表达式。

使用循环读取文件

        while和until可以处理标准输入,这让使用while和until循环处理文件成为可能。

#!/bin/bash# while-read: read lines from a filewhile read distro version release;doprintf "Distro:%s\tVersion:%s\tReleases:%s\n" \$distro \$version \$release
done < distros.txt

为将一份文件重定向到循环中,我们可在done语句之后添加重定向操作符。循环使用read命令读取重定向文件中的字段。

在到达文件末端之前,退出状态皆为0。在读取过文件中的最后一行后,read命令退出,此时退出状态变为非0,循环终止。

        将标准输出重定向到循环中也是可以的!

#!/bin/bash# while-read2:read lines from a filesort -k 1,1 -k 2n distros.txt | while read distro version release;doprintf "Distro:%s\tVersion:%s\tReleased:%s\n" \$distro \$version \$release
done

需要注意的是因为管道是在子shell中进行循环操作。当循环终止时,循环内部新建的变量或者对变量的赋值效果都会丢失

http://www.lryc.cn/news/89128.html

相关文章:

  • 国内免费可用的ChatGPT网页版
  • 用同样的关键词测试不同的人工智能
  • shell变量类型含义 长方形面积计算 截取相应字段方法
  • Java:从单线程计数器到多线程数据同步synchronized和原子类Atomic
  • 提前进入行业顶尖阵营:高性能计算实习的竞争优势
  • Java程序设计入门教程--标识符和关键字
  • 国产IC芯片自动化测试系统ATECLOUD,助力芯片测试自动化
  • BeanFactory和ApplicationContext有什么区别?
  • js的BOM对象中的window、location使用
  • DAY 68 redis高可用的主从复制、哨兵、cluster集群
  • leetcode 1209 学会删除字符串
  • JavaScript6
  • 轻松安装Redis:不用担心配置问题
  • ChatGPT学习研究总结
  • SpringBoot枚举入参实战
  • Ansible介绍
  • GPT-4的免费使用方法分享
  • 一个产品的诞生
  • MQTT与传统的HTTP协议对比,优势在哪里呢?
  • 热榜!阿里出品2023版Java架构师面试指南,涵盖Java所有核心技能
  • 【小程序】封装时间选择组件:用单元格van-cell和插槽slot,包括起始时间和终止时间
  • 华为OD机试真题B卷 Java 实现【猜密码】
  • 沉淀-MYSQL
  • OJ练习第116题——二进制矩阵中的最短路径(BFS)
  • 2023上半年软件设计师真题评析
  • (汇编) 基于VS的x86汇编基础指令
  • 算法Day16 | 104.二叉树的最大深度,559.n叉树的最大深度, 111.二叉树的最小深度,222.完全二叉树的节点个数
  • java设计模式之责任链设计模式的前世今生
  • 是面试官放水,还是公司太缺人了?华为原来这么容易就进了...
  • PLC/DCS系统常见的干扰现象及判断方法