Shell脚本-for循环语法结构

一、前言

在 Linux Shell 脚本编程中,for 循环 是最常用的控制结构之一,用于重复执行一段命令,特别适用于处理列表、文件、数字序列等场景。

本文将详细介绍 Shell 脚本中 for 循环的各种语法结构,包括:

✅ 经典 for in 结构
✅ C 风格 for 循环
✅ 遍历命令输出
✅ 实际应用场景
✅ 常见错误与调试技巧

无论你是刚接触 Shell 脚本的新手,还是希望巩固基础的开发者,这篇文章都能为你提供实用的知识点。

二、Shell 中 for 循环的基本语法

Shell 脚本中的 for 循环主要有两种写法:

1. for ... in ... 结构(最常用)

for 变量 in 列表
do命令1命令2...
done

或简写为一行(注意分号):

for 变量 in 列表; do 命令; done

✅ 说明:

  • 变量:每次循环中取列表中的一个值;
  • 列表:可以是字符串、数字、命令输出、通配符等;
  • do 和 done 之间是循环体。

2. C 风格 for 循环(类 C 语言语法)

for (( 初始值; 条件; 步长 ))
do命令
done

适用于需要计数、递增/递减的场景。

三、for 循环的常见用法与示例

1. 遍历字符串列表

#!/bin/bashfor fruit in apple banana orange
doecho "我喜欢吃: $fruit"
done

输出:

我喜欢吃: apple
我喜欢吃: banana
我喜欢吃: orange

2. 遍历数字序列

方法一:使用 seq 命令
for i in $(seq 1 5)
doecho "数字: $i"
done
方法二:使用花括号 {}
for i in {1..10..2}  # 1 到 10,步长为 2
doecho "奇数: $i"
done

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

3. C 风格 for 循环(推荐用于数值计算)

for (( i=1; i<=5; i++ ))
doecho "计数: $i"
done

✅ 优点:语法清晰,适合复杂循环逻辑。

4. 遍历文件或目录

for file in *.txt
doif [ -f "$file" ]; thenecho "找到文本文件: $file"fi
done

✅ 说明:*.txt 会匹配当前目录下所有 .txt 文件。

5. 遍历命令输出结果

使用 $() 或反引号执行命令,并将结果作为列表:

for user in $(who | awk '{print $1}' | sort -u)
doecho "当前登录用户: $user"
done

⚠️ 注意:如果输出包含空格或特殊字符,建议使用 while read 更安全。

6. 遍历数组元素

fruits=("apple" "banana" "orange")
for fruit in "${fruits[@]}"
doecho "水果: $fruit"
done

✅ 推荐使用 "${array[@]}" 防止空格问题。

四、进阶技巧与最佳实践

1. 在一行中写 for 循环(命令行常用)

for i in {1..3}; do echo "Hello $i"; done

非常适合快速测试或临时任务。

2. 使用 break 和 continue

  • break:跳出整个循环;
  • continue:跳过本次循环,进入下一次;
for i in {1..5}
doif [ $i -eq 3 ]; thencontinue  # 跳过 3fiif [ $i -gt 4 ]; thenbreak     # 大于 4 就退出fiecho "i = $i"
done

输出:

i = 1
i = 2
i = 4

3. 嵌套 for 循环

for i in {1..2}
dofor j in {a,b}doecho "组合: $i$j"done
done

输出:

组合: 1a
组合: 1b
组合: 2a
组合: 2b

五、常见问题与注意事项

问题原因解决方法
报错:command not found语法错误或缺少 do/done检查语法是否完整
空格导致解析错误变量未加引号使用 "$var" 包裹变量
遍历文件名含空格失败未正确引用使用 while read 或加引号
seq 命令不可用某些系统未安装改用 {1..10} 或 C 风格
中文乱码编码问题设置 LANG=en_US.UTF-8 或使用 UTF-8 编码保存脚本

六、总结对比表

写法适用场景是否推荐说明
for i in list字符串、文件、命令输出最常用
for i in {1..10}数字序列简洁高效
for i in $(seq ...)兼容旧系统⚠️可读性稍差
for ((...))数值计算、计数类 C 风格,逻辑清晰
for var in "${array[@]}"遍历数组安全且标准
for output in $(cmd)命令输出⚠️注意空格和特殊字符

七、结语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919195.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记SpringBoot3.x + Thymeleaf 项目实现(MVC架构模式)

目录 前言 一、创建SpringBoot项目 1. 创建项目 2. 运行项目 二、连接数据库实现登录 1. pom.xml文件引入依赖包 2. application.yml文件配置 3. 数据持久层&#xff0c;mybatis操作映射 4. Service接口及实现 5. Controller代码 6. Thymeleaf页面登录 7. 运行项目…

Java 导出word 实现表格内插入图表(柱状图、折线图、饼状图)--可编辑数据

表格内插入图表导出效果表格内图表生成流程分析 核心问题与解决方案 问题 Word 图表作为独立对象&#xff0c;容易与文本分离位置难以精确控制&#xff0c;编辑时容易偏移缺乏与表格数据的关联性 解决方案 直接嵌入&#xff1a;将图表嵌入表格单元格&#xff0c;确保数据关联精…

北京JAVA基础面试30天打卡12

1.MySQL中count(*)、count(I)和count(字段名)有什么区别&#xff1f; 1**.COUNT ()**是效率最高的统计方式&#xff1a;COUNT()被优化为常量&#xff0c;直接统计表的所有记录数&#xff0c;不依赖字段内容&#xff0c;开销最低。推荐在统计整个表的记录数时使用。 2.**COUNT(1…

【AI】——结合Ollama、Open WebUI和Docker本地部署可视化AI大语言模型

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大三学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

RAG学习(二)

构建索引 一、向量嵌入 向量嵌入&#xff08;Embedding&#xff09;是一种将真实世界中复杂、高维的数据对象&#xff08;如文本、图像、音频、视频等&#xff09;转换为数学上易于处理的、低维、稠密的连续数值向量的技术。 想象一下&#xff0c;我们将每一个词、每一段话、…

亚马逊店铺绩效巡检_影刀RPA源码解读

一、项目简介 本项目是一个基于RPA开发的店铺绩效巡店机器人。该机器人能够自动化地登录卖家后台&#xff0c;遍历多个店铺和站点&#xff0c;收集并分析各类绩效数据&#xff0c;包括政策合规性、客户服务绩效、配送绩效等关键指标&#xff0c;并将数据整理到Excel报告中&…

跨越南北的养老对话:为培养“银发中国”人才注入新动能

2025年8月16日&#xff0c;北京养老行业协会常务副会长陈楫宝一行到访广州市白云区粤荣职业培训学校&#xff0c;受到颐年集团副总李娜的热情接待。此次访问不仅是京穗两地养老行业的一次深度交流&#xff0c;更为推动全国智慧养老体系建设、提升养老服务专业化水平注入了新动能…

Spring IOC 学习笔记

1. 概述Spring IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是一种设计思想&#xff0c;通过依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;实现。它的核心思想是将对象的创建和依赖关系的管理交给Spring容器&#xff0c;从而降…

揭开Android Vulkan渲染封印:帧率暴增的底层指令

ps&#xff1a;本文内容较干&#xff0c;建议收藏后反复边跟进源码边思考设计思想。壹渲染管线的基础架构为什么叫渲染管线&#xff1f;这里是因为整个渲染的过程涉及多道工序&#xff0c;像管道里的流水线一样&#xff0c;一道一道的处理数据的过程&#xff0c;所以使用渲染管…

HTTP 请求转发与重定向详解及其应用(含 Java 示例)

在 Web 开发中&#xff0c;我们经常需要在不同页面之间跳转&#xff0c;比如登录成功后跳到首页、提交表单后跳到结果页面。这时&#xff0c;常见的两种跳转方式就是 请求转发&#xff08;Request Forward&#xff09; 和 重定向&#xff08;Redirect&#xff09;。虽然它们都能…

如何将 MCP Server (FastMCP) 配置为公网访问(监听 0.0.0.0)

如何将 MCP Server &#xff08;FastMCP&#xff09; 配置为公网访问&#xff08;监听 0.0.0.0&#xff09;引言常见错误尝试根本原因&#xff1a;从源码解析正确的解决方案总结引言 在使用 Model Context Protocol(MCP) 框架开发自定义工具服务器时&#xff0c;我们经常使用 …

The Network Link Layer: 无线传感器中Delay Tolerant Networks – DTNs 延迟容忍网络

Delay Tolerant Networks – DTNs 延迟容忍网络架构归属Delay Tolerant Networks – DTNs 延迟容忍网络应用实例例子 1&#xff1a;瑞典北部的萨米人 (Saami reindeer herders)例子 2&#xff1a;太平洋中的动物传感网络DTNs路由方式——存储&转发DTNs移动模型Random walk …

计算机视觉(opencv)实战二——图像边界扩展cv2.copyMakeBorder()

OpenCV copyMakeBorder() 图像边界扩展详解与实战在图像处理和计算机视觉中&#xff0c;有时需要在原始图像的四周增加边界&#xff08;Padding&#xff09;。这种操作在很多场景中都有应用&#xff0c;比如&#xff1a;卷积神经网络&#xff08;CNN&#xff09;中的图像预处理…

ansible管理变量和事实

ansible管理变量和事实与实施任务控制 在 Ansible 中&#xff0c;变量和事实&#xff08;Facts&#xff09;就像给剧本&#xff08;Playbook&#xff09;配备的 “信息工具箱”&#xff0c;让你的自动化配置管理更灵活、更智能。 变量&#xff1a;提前准备的 “预设信息” 变…

STM32--寄存器与标准库函数--基本定时器

目录 前言 基本定时器概念 定时时间 定时器时钟确定 倍频锁相环被正确配置为168MHz 定时器的库函数操作 代码 定时器的寄存器操作 代码 寄存器 后言 前言 使用平台:STM32F407ZET6 使用数据手册&#xff1a;STM32F407数据手册.pdf 使用参考手册&…

PCA 实现多向量压缩:首个主成分的深层意义

PCA 实现多向量压缩 第一个主成分(components_[0])正是数据协方差矩阵中最大特征值对应的特征向量。 ,layer_attention_vector[layer] 被赋值为 pca.components_[0],这确实是一个特征向量,具体来说是 PCA 分解得到的第一个主成分(主特征向量)。 关于它的维度: 假设 c…

网络常识-DNS如何解析

DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;是互联网的“地址簿”&#xff0c;负责将人类易记的域名&#xff08;如www.example.com&#xff09;转换为计算机可识别的IP地址&#xff08;如192.168.1.1&#xff09;。其工作流程可以简单理解为“从域名到…

Java中 23 种设计模式介绍,附带示例

文章目录设计模式六大原则设计模式分类1、创建型模式&#xff08;Creational Patterns&#xff09;2、结构型模式&#xff08;Structural Patterns&#xff09;3、行为型模式&#xff08;Behavioral Patterns&#xff09;一、创建型模式&#xff08;Creational Patterns&#x…

嵌入式开发入门——电子元器件~电磁继电器、蜂鸣器

文章目录电磁继电器定义关键参数实物蜂鸣器实物内部结构分类关键参数电磁继电器 定义 概述&#xff1a;电磁继电器是利用电磁感应原理职称的一种电磁开关&#xff0c;他能通过&#xff1a;低电压、低电流的电路&#xff0c;来控制高电压、高电流的电路。 关键参数 线圈电压…

ROS2基础

1.helloworld案例1.创建功能包&#xff08;C&#xff09;终端下&#xff0c;进入ws00_helloworld/src目录&#xff0c;使用如下指令创建一个C 功能包:ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld执行完毕&a…