Linux Shell有多少种循环类型,该如何选择合适的循环使用?
Linux Shell循环语法选择指南
选择循环类型的核心是匹配你的使用场景,避免踩语法隐含的坑,不同场景的选型规则如下:
- 逐行读取文件/输入流:优先用
while read -r
这是最稳妥的逐行读取方案,不会因为行内存在空格、特殊字符拆分内容,-r参数用于避免自动转义行内的反斜杠字符。
正确示例:
while read -r line; do echo "$line" done < input.file
避坑提示:绝对不要用示例中的for line in cat a.txt``写法,这种写法存在两个问题:一是语法错误,循环结尾应该写done而非while;二是会默认按IFS(内部字段分隔符)拆分内容,行内存在空格、制表符时会把一行拆成多个循环项,大文件场景下性能也极差,仅适合遍历没有特殊分隔符的短列表。
- 遍历指定列表/通配符匹配结果:用
for in循环
适合遍历已知的离散值,比如文件名、脚本参数、固定字符串列表:
# 遍历当前目录所有txt文件 for file in *.txt; do echo "处理文件:$file" done # 遍历脚本传入的参数 for arg in "$@"; do echo "传入参数:$arg" done
- 固定次数循环/需要数值计数:优先用C风格for循环
如果需要控制循环次数、对计数变量做运算,用C风格的for(())写法最直观:
# 循环10次 for ((i=1; i<=10; i++)); do echo "当前是第 $i 次循环" done
如果是简单的固定次数场景,也可以用大括号扩展简化写法:
for i in {1..10}; do echo "当前是第 $i 次循环" done
- 循环直到满足条件才终止:用
until循环
和while逻辑相反,while是条件为真时持续循环,until是条件为假时持续循环,直到条件为真就退出,适合等待某个状态就绪的场景:
# 等待nginx进程启动 until pgrep nginx > /dev/null 2>&1; do echo "等待nginx启动..." sleep 1 done echo "nginx已启动"
内容的提问来源于stack exchange,提问作者seqwait
相关产品推荐
相关产品推荐

