一、前言
在 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) | 命令输出 | ⚠️ | 注意空格和特殊字符 |
七、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!