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

Shell 脚本流程控制语句详解(四):while 循环详解

在编程中,循环结构能让我们反复执行一段代码,极大地提高脚本的自动化能力。while 循环是 Shell 脚本中常用的循环语句之一,它根据条件判断是否继续执行循环体。

本文将详细介绍 while 循环的语法、用法、实例及注意事项,帮助你灵活运用 while 循环写出高效的脚本。


目录

  1. 什么是 while 循环?
  2. while 循环基本语法
  3. 示例详解
  4. 使用 break 和 continue 控制循环
  5. 无限循环
  6. 常见错误及调试技巧

1. 什么是 while 循环?

while 循环会先判断条件表达式的真假,如果为真(返回状态码为0),则执行循环体;条件为假时停止循环。

这意味着循环次数不是固定的,而是根据条件动态决定。

2. while 循环基本语法

while [ 条件 ]
do命令序列
done
  • 条件:通常是一个返回真假状态的表达式,比如比较语句、文件测试等。
  • dodone 包含了循环执行的命令块。

3. 示例详解

1:计数循环

#!/bin/bashcount=1while [ $count -le 5 ]
doecho "当前计数:$count"count=$((count + 1))
done

说明

  • 变量 count 初始为1。
  • 条件 [ $count -le 5 ] 判断计数是否小于等于5。
  • 每次循环后计数加1。
  • 条件不满足时循环结束。

2:读取文件每行内容

#!/bin/bashfilename="test.txt"while read line
doecho "读取行内容:$line"
done < "$filename"

说明

  • 使用 read 逐行读取文件内容。
  • < "$filename" 将文件内容作为输入传递给循环。

4. 使用 break 和 continue 控制循环

  • break:跳出当前循环,终止循环执行。
  • continue:跳过本次循环后续命令,直接开始下一轮循环判断。

1:使用 break

#!/bin/bashcount=1while [ $count -le 10 ]
doif [ $count -eq 3 ]; thenecho "到达3,退出循环"breakfiecho "计数:$count"count=$((count + 1))
done

**注意:**看条件的执行先后顺序,当while达到3的时候,就不在进行计数了,执行完if就直接退出了循环

2:使用 continue

#!/bin/bashcount=0while [ $count -lt 5 ]
docount=$((count + 1))if [ $count -eq 3 ]; thenecho "跳过3"continuefiecho "计数:$count"
done

5. 无限循环

有时需要无限循环,直到外部条件触发退出:

#!/bin/bashwhile true
doecho "按 Ctrl+C 退出循环"sleep 1
done

这个我们在动态的查看日志的时候最能体现出来,tail -f file.log

6. 常见错误及调试技巧

  • 条件语法错误[] 两侧必须空格,如 [ $count -le 5 ]
  • 变量未初始化:使用变量前要赋初值,避免空值导致错误。
  • 死循环:循环条件始终为真,且循环体内未改变条件,导致无法退出。
  • 调试技巧:使用 set -x 开启调试,观察执行细节。

7. 小结

  • while 循环根据条件判断动态决定是否执行循环体。
  • 适合处理需要循环次数不确定的场景,如读取文件、等待事件等。
  • 可配合 breakcontinue 灵活控制循环流程。
  • 编写时注意语法规范,避免死循环。
  • 掌握 while 循环是写好 Shell 脚本的重要技能。

如果你真的在跟着我学习,请把下面的这个题做了,需要源代码参考的,看第二篇文章

“数字猜猜乐”游戏
1.程序自动生成一个 1 到 100 的随机整数。
2.用户最多有 7 次猜测机会。
3.每次提示用户输入一个数字:
4.如果不是合法整数,提示错误并让用户重新输入(使用 continue)。
5.如果猜大了,提示“太大了!”。
6.如果猜小了,提示“太小了!”。
7.如果猜对了,提示“恭喜你猜对了!”,并显示用了几次机会。
8.如果用户在规定次数内没有猜中,提示:“很遗憾,你没有猜中。正确答案是:XX”
9.在每次猜测后显示剩余次数。
10.猜完之后询问用户是否再玩一次(输入 y 继续,其他键退出)

提示:

  • 使用 $RANDOM 生成随机数。
  • 使用 while 实现主循环。
  • 使用正则表达式校验输入是否为数字。
  • 使用变量记录尝试次数、剩余次数、最佳成绩。
  • 使用嵌套的 while 控制是否重玩游戏。

正则表达式不会的同学,可以参考这个[[ "变量" =~ ^[0-9]+$ ]]

  • =~ 表示使用正则表达式进行匹配
  • ^[0-9]+$ 正则表达式本身,用来判断一个变量是否为纯数字字符串

http://www.dtcms.com/a/312772.html

相关文章:

  • lua table常用函数汇总
  • Django 序列化详解:从 Model 到 JSON,全面掌握数据转换机制
  • 使用AndroidStudio调试Framework源码
  • 腾讯人脸识别
  • 数据治理:DQC(Data Quality Center,数据质量中心)概述
  • [嵌入式embed]C51单片机STC-ISP提示:正在检测目标单片机
  • 《前端无障碍设计的深层逻辑与实践路径》
  • MyBatis动态SQL精要:从<if>到<foreach>的灵活拼接之道
  • 高质量数据集|建设三大难点
  • [硬件电路-140]:模拟电路 - 信号处理电路 - 锁定放大器概述、工作原理、常见芯片、管脚定义
  • [硬件电路-133]:模拟电路 - 信号处理电路 - 电荷放大器概述、工作原理、常见芯片、管脚定义
  • 深度学习(鱼书)day10--与学习相关的技巧(后两节)
  • 仿TCmalloc内存分配器
  • 后端研发转型爬虫实战:Scrapy 二开爬虫框架的避坑指南
  • C++入门自学Day5-- C/C++内存管理(续)
  • jvm之jconsole的使用
  • Maven 常用命令详解
  • react native中markdown添加数学公式的支持
  • 文明存续的时间博弈:论地球资源枯竭临界期的技术突围与行动紧迫性
  • STM32-驱动OLED显示屏使用SPI(软件模拟时序)实现
  • 【stm32】按键控制LED以及光敏传感器控制蜂鸣器
  • PYTHON从入门到实践-18Django模版渲染
  • 我的世界进阶模组开发教程——伤害(2)
  • 20250803让飞凌OK3576-C开发板在Rockchip的原厂Android14下适配声卡NAU88C22YG【Android部分】
  • C++:STL中的栈和队列的适配器deque
  • 多模态大模型的原理
  • 机器人产业需要技术与资本双驱动,在泡沫期中探索商业化路径
  • Python中的sys.path与PYTHONPATH全解析:模块导入路径的底层机制与最佳实践
  • LDAP身份验证前世今生
  • Corrosion2靶机练习笔记