LinuxShell循环语句如何用_forwhile实战示例【教程】

发布时间 - 2025-12-20 00:00:00    点击率:
for适合遍历已知集合,while适合条件驱动的不确定循环;for常用于列表、文件、数字范围,while用于读取输入、轮询或状态检测;二者可嵌套组合,需注意引号、IFS、子shell等避坑细节。

Linux Shell 中的 forwhile 是最常用的循环结构,掌握它们能大幅提升自动化脚本编写效率。关键在于理解适用场景:for 适合已知范围或列表遍历,while 更适合条件驱动、不确定次数的重复操作。

for 循环:遍历固定集合或数字范围

for 循环语法简洁,常用于处理数组、文件名、命令输出或数字序列。

  • 遍历字符串列表
    for name in Alice Bob Charlie; do echo "Hello $name"; done
  • 遍历当前目录所有 .sh 文件
    for file in *.sh; do [[ -f "$file" ]] && echo "Found script: $file"; done
    注意加 [[ -f "$file" ]] 防止通配符无匹配时原样输出 *.sh
  • 数字范围(用 seq 或 brace expansion)
    for i in {1..5}; do echo "Step $i"; done
    或兼容性更强写法:for i in $(seq 1 2 10); do echo "Odd: $i"; done(1 到 10 的奇数)

while 循环:按条件持续执行,适合读取输入或轮询

while 在每次迭代前判断条件,只要返回 true 就继续,适合处理动态数据流或等待状态变化。

  • 逐行读取文件内容
    while IFS= read -r line; do echo "Line: $line"; done
    IFS= 保留行首尾空格,-r 防止反斜杠转义,这是安全读取的标准写法。
  • 等待某个进程启动(轮询检查)
    while ! pgrep nginx > /dev/null; do echo "Waiting for nginx..."; sleep 2; done
    每 2 秒检查一次 nginx 进程是否存在,存在则退出循环。
  • 从命令输出中读取(配合管道需用 while read)
    ps aux | awk '$3 > 1.0 {print $11}' | while read cmd; do echo "High CPU: $cmd"; done
    注意:管道中的 while 会运行在子 shell,变量修改无法回传到外层;如需全局变量,改用重定向或 process substitution。

for 和 while 的实用组合技巧

单一循环不够用时,嵌套或混合使用可解决复杂逻辑。

  • for 遍历主机,while 检查端口连通性
    for host in web1 db2 cache3; do echo "Testing $host"; while ! nc -z $host 22 -w 2; do echo "Still down..."; sleep 1; done; echo "$host OK"; done
  • 用 while 控制 for 的执行次数(带计数器)
    count=0; while [ $count -lt 3 ]; do for item in a b c; do echo "$item-$count"; done; ((count++)); done

避坑提醒:常见错误与修复

初学者容易忽略这些细节,导致脚本行为异常。

  • for 中未引号包裹变量:如 for f in $files → 应为 for f in $files(若 files 是字符串)或更稳妥用数组 files=("a b" "c d"); for f in "${files[@]}"; do ...
  • while read 遇到空行或特殊字符中断:始终加 IFS= read -r
  • 忘记给 while 条件提供更新逻辑,造成死循环,例如 while [ $n -eq 5 ]; do echo $n; done 缺少 ((n++))
  • 在管道中修改变量后失效:用 while ...; do ...; done 替代 command | while ... 可保持变量作用域


# linux  # nginx  # 端口  # ai  # echo  # print  # NULL  # count  # for  # while  # 全局变量  # 字符串  # 循环  # input  # 自动化  # 遍历  # 不确定  # 道中  # 这是  # 如需  # 更强  # 关键在于  # 更适合  # 最常用  # 是否存在 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何与Inertia.js和Vue/React构建现代单页应用  如何在 React 中条件性地遍历数组并渲染元素  JavaScript如何实现继承_有哪些常用方法  如何在宝塔面板创建新站点?  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  在线教育网站制作平台,山西立德教育官网?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  WordPress 子目录安装中正确处理脚本路径的完整指南  晋江文学城电脑版官网 晋江文学城网页版直接进入  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  *服务器网站为何频现安全漏洞?  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  再谈Python中的字符串与字符编码(推荐)  php json中文编码为null的解决办法  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  如何快速搭建高效WAP手机网站?  微信小程序 五星评分(包括半颗星评分)实例代码  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  如何在Ubuntu系统下快速搭建WordPress个人网站?  网站建设保证美观性,需要考虑的几点问题!  Python文本处理实践_日志清洗解析【指导】  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  浅述节点的创建及常见功能的实现  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  如何快速搭建高效简练网站?  香港服务器选型指南:免备案配置与高效建站方案解析  Python进程池调度策略_任务分发说明【指导】  如何在云服务器上快速搭建个人网站?  手机网站制作与建设方案,手机网站如何建设?  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  EditPlus中的正则表达式 实战(2)  javascript日期怎么处理_如何格式化输出  如何在香港免费服务器上快速搭建网站?  如何选择可靠的免备案建站服务器?  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  个人摄影网站制作流程,摄影爱好者都去什么网站?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  如何在不使用负向后查找的情况下匹配特定条件前的换行符  Laravel如何使用模型观察者?(Observer代码示例)