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

Shell脚本-while循环语法结构

一、前言

在 Linux Shell 脚本编程中,循环结构是控制程序流程的重要手段之一。其中,while 循环因其灵活性和实用性,被广泛应用于日志监控、用户交互、定时任务、文件处理等场景。

本文将系统讲解 Shell 中 while 循环的语法结构,结合多个实用示例,帮助你掌握其用法,并避免常见错误。

二、while 循环的基本语法

while 循环的语法结构如下:

while [ 条件判断 ]
do# 循环体:执行的命令或语句
done

或者使用双括号(适用于数值比较):

while (( 条件表达式 ))
do# 循环体
done

🔁 执行逻辑

  • 先判断条件是否为真(返回状态码为 0)
  • 如果为真,则执行 do 和 done 之间的命令
  • 执行完后再次判断条件
  • 直到条件为假时退出循环

三、while 循环的经典用法与案例

✅ 案例1:基本计数循环

打印从 1 到 5 的数字:

#!/bin/bashi=1
while [ $i -le 5 ]
doecho "当前数字: $i"i=$((i + 1))  # 注意:不能写成 i++,需使用算术扩展
done

✅ 输出:

当前数字: 1
当前数字: 2
当前数字: 3
当前数字: 4
当前数字: 5

📌 说明

  • [ $i -le 5 ] 使用 -le 表示“小于等于”
  • $((i + 1)) 是 Shell 中的算术运算方式

✅ 案例2:使用双括号简化数值判断

#!/bin/bashi=1
while (( i <= 5 ))
doecho "数字: $i"((i++))  # 双括号内可以直接使用 ++、--
done

✅ 优点:语法更简洁,支持 C 风格的自增/自减操作。

✅ 案例3:无限循环(常用于服务监控)

#!/bin/bashwhile true
doecho "监控中... $(date)"sleep 2  # 每隔2秒输出一次时间
done

🔁 这是一个典型的无限循环,常用于后台服务监控、日志轮询等场景。

📌 终止方式:按 Ctrl+C 中断。

✅ 案例4:读取文件内容(逐行处理)

while 循环常用于读取文件的每一行,是 Shell 脚本中最常见的用法之一。

假设有一个文件 data.txt,内容如下:

apple
banana
cherry

使用 while read 读取并处理:

#!/bin/bashwhile read line
doecho "水果: $line"
done < data.txt

✅ 输出:

水果: apple
水果: banana
水果: cherry

📌 说明

  • done < data.txt 表示将文件重定向给 while 循环
  • read line 每次读取一行并赋值给变量 line

✅ 案例5:用户交互式输入

#!/bin/bashecho "请输入内容(输入 'quit' 退出):"while true
doread -p "输入: " inputif [ "$input" = "quit" ]; thenecho "退出程序"breakelseecho "你输入的是: $input"fi
done

✅ 使用 break 可以提前跳出循环。

四、while 循环的常见控制语句

语句作用
break立即退出整个 while 循环
continue跳过本次循环剩余部分,进入下一次判断
exit退出整个脚本(不仅仅是循环)

示例:使用 continue 跳过偶数

i=1
while [ $i -le 10 ]
doif (( i % 2 == 0 )); then((i++))continuefiecho "奇数: $i"((i++))
done

✅ 输出:1, 3, 5, 7, 9

五、常见陷阱与注意事项

❌ 陷阱1:变量在管道中的作用域问题

错误写法:

count=0
echo -e "a\nb\nc" | while read line
docount=$((count + 1))echo $line
done
echo "总数: $count"  # 输出:0

❗ 问题:管道 | 会创建子 shell,while 内部修改的变量在外部不可见。

✅ 正确做法:使用重定向方式

count=0
while read line
docount=$((count + 1))echo $line
done <<< "$(echo -e 'a\nb\nc')"
echo "总数: $count"  # 输出:3

或者使用临时文件或 here-string。

❌ 陷阱2:忘记更新循环变量导致死循环

i=1
while [ $i -le 5 ]
doecho $i# 忘记写 i=$((i+1)),导致无限输出 1
done

📌 建议:写完 while 循环后,立即检查是否有变量更新逻辑。

❌ 陷阱3:条件判断语法错误

  • 错误:while [ i -lt 10 ](缺少 $
  • 正确:while [ $i -lt 10 ]
  • 或者使用:while (( i < 10 ))

六、总结对比表

语法形式适用场景特点
while [ condition ]字符串、文件、基本条件判断使用 [ ] 或 [[ ]]
while (( condition ))数值比较、算术表达式支持 ++, --, <, > 等
while true无限循环配合 break 使用
while read ...读取文件或输入流常用于文本处理
while ...; do ...; done < file文件重定向读取推荐方式,避免子 shell 问题

七、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

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

相关文章:

  • ACPI TABLE 方式加载device driver--以spi controller为例
  • 字节 Golang 大模型应用开发框架 Eino简介
  • Pulsar存储计算分离架构设计之存储层BookKeeper(上)
  • 在线编程题目之小试牛刀
  • C#高级语法_委托
  • Windows平台Frida逆向分析环境完整搭建指南
  • 从需求到部署全套方案:餐饮服务许可证数据可视化分析系统的大数据技术实战
  • 发票识别工具,合并PDF提取信息
  • JavaScript字符串详解
  • 001.Redis 简介及安装
  • 【杂谈】-以质代量:谷歌主动学习范式重构AI训练逻辑
  • Mac(四)自定义按键工具 Hammerspoon 的安装和使用
  • vue封装请求拦截器 响应拦截器
  • SCAI采用公平发射机制成功登陆LetsBonk,60%代币供应量已锁仓
  • 智能合约里的 “拒绝服务“ 攻击:让你的合约变成 “死机的手机“
  • 数学建模 14 中心对数比变换
  • 原子操作及基于原子操作的shared_ptr实现
  • Leaflet赋能:WebGIS视角下的省域区县天气可视化实战攻略
  • 数据结构:二叉搜索树(Binary Search Tree)
  • ansible管理变量和事实
  • 《Python学习之文件操作:从入门到精通》
  • 剑指offer第2版——面试题5:替换空格
  • Java注解学习记录
  • 26. 值传递和引用传递的区别的什么?为什么说Java中只有值传递
  • 大模型对齐算法合集(一)
  • Zemax 中的透镜设计 - 像差理论
  • 评测系统构建
  • 深入分析 Linux PCI Express 子系统
  • 计算机网络 TCP time_wait 状态 详解
  • 10 SQL进阶-SQL优化(8.15)