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

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.lryc.cn/news/623822.html

相关文章:

  • 【前端基础】19、CSS的flex布局
  • 蓝凌EKP产品:JSP 性能优化和 JSTL/EL要点检查列表
  • rt-thread audio框架移植stm32 adc+dac,用wavplayer录音和播放
  • 【从零开始学习Redis】项目实战-黑马点评D2
  • scikit-learn/sklearn学习|多任务套索回归MultiTaskLasso解读
  • Windows_Server软件定义网络架构
  • 【Linux系列】如何在 Linux 服务器上快速获取公网
  • 每日两道算法题:DAY3
  • uniappx 安卓端本地打包的一些总结
  • 【位运算】查询子数组最大异或值|2693
  • CNV检测--单细胞空间vs基因组WGS/WES
  • AutoSar BSW介绍
  • 《Nursing Research》(护理 SCI)LaTeX 模板详细教程:从入门到投稿(二)
  • http工作流程
  • 数据电台询价的询价要求
  • 数据链路层(1)
  • FX10/20 (CYUSB401X)开发笔记5 固件架构
  • 基于Netty的高并发WebSocket连接管理与性能优化实践指南
  • prototype 和 _ _ proto _ _的关联
  • multiboot 规范实践分析
  • 交叉编译 手动安装 SQLite 库 移植ARM
  • Python数据分析案例82——基于机器学习的航空公司满意度分析
  • 攻防世界—unseping(反序列化)
  • pytorch线性回归
  • (一)React企业级后台(Axios/localstorage封装/动态侧边栏)
  • iSCSI服务配置全指南(含服务器与客户端)
  • JMeter(进阶篇)
  • LeetCode算法日记 - Day 13: 前缀和、二维前缀和
  • es下载、安装、部署以及集成和mysql数据同步
  • **守护进程(Daemon)** 是一种在后台运行的特殊进程