
概述Shell脚本中的循环结构主要有三种类型for循环- 适用于已知循环次数的场景while循环- 适用于条件控制的循环until循环- 与while相反条件为假时执行循环控制关键字break- 跳出整个循环continue- 跳过当前迭代一、for循环for循环主要分为迭代列表和C风格两种写法。1.1 遍历列表最基本的用法列表元素用空格分隔。# 示例1遍历列表foriin12345doecho数字:$idone执行效果xayahXayah:~$ chmod x for-demo1.sh xayahXayah:~$ ./for-demo1.sh 数字:1 数字:2 数字:3 数字:4 数字:51.2 遍历序列使用花括号语法{start..end}可以快速生成序列。# 示例2使用序列foriin{1..5};doecho序列值$idone执行效果xayahXayah:~$ ./for-demo2.sh 序列值1 序列值2 序列值3 序列值4 序列值5注意如果do与for在同一行必须使用分号;作为分隔符。1.3 遍历步长序列序列语法扩展{start..end..step}支持自定义步长。# 示例3步长序列输出1-9的奇数foriin{1..9..2};doecho序列值$idone执行效果xayahXayah:~$ ./for-demo3.sh 序列值1 序列值3 序列值5 序列值7 序列值91.4 遍历文件使用通配符可以遍历目录下的文件。# 示例4遍历家目录forfilein~/*;doecho文件$filedone执行效果xayahXayah:~$ ./for-demo4.sh 文件/home/xayah/for-demo1.sh 文件/home/xayah/for-demo2.sh 文件/home/xayah/for-demo3.sh 文件/home/xayah/for-demo4.sh 文件/home/xayah/poem.txt1.5 C语言风格使用双重括号(( ))实现类似C语言的for循环。# 示例5C语言风格for((i0;i5;i));doecho循环:$idone执行效果xayahXayah:~$ ./for-demo5.sh 循环:0 循环:1 循环:2 循环:3 循环:4 循环:51.6 遍历命令输出通过命令替换可以遍历命令的执行结果。# 示例6遍历系统用户foruserin$(cut-d:-f1/etc/passwd);doecho用户:$userdone执行效果xayahXayah:~$ ./for-demo6.sh 用户:root 用户:daemon 用户:bin 用户:sys 用户:sync 用户:games ……省略其他输出二、while循环while循环在条件为真时执行主要有三种常见用法2.1 条件判断使用[ ]或(( ))进行条件判断。#!/bin/bashcount1while[$count-le5];doechocount $count((count))done执行效果xayahXayah:~$ ./while-demo1.sh count 1 count 2 count 3 count 4 count 52.2 读取文件使用输入重定向逐行读取文件内容。#!/bin/bashcount1whilereadline;doecho$count:$line((count))donepoem.txt执行效果xayahXayah:~$ ./while-demo2.sh 1:《旱夏见僵蚓感怀》 2:作者DeepSeek 3:七月炎光灼地红僵蚓曝尘泥淖中。 4:昔时膏润藏深穴今向焦枯叹昊穹。 5:火云烧尽三春绿燹气蒸干九泽风。 6:莫道天威难测度人间斧凿亦神工。注意文件末尾需要有一个换行符否则最后一行可能读取不到。2.3 管道循环通过管道将数据传递给while循环处理。#!/bin/bashcount1echo《旱夏见僵蚓感怀》 作者DeepSeek 七月炎光灼地红僵蚓曝尘泥淖中。 昔时膏润藏深穴今向枯焦叹昊穹。 火云烧尽三春绿燹气蒸干九泽风。 莫道天威难测度人间斧凿亦神工。|whilereadline;doecho$count:$line((count))done执行效果1:《旱夏见僵蚓感怀》 2:作者DeepSeek 3:七月炎光灼地红僵蚓曝尘泥淖中。 4:昔时膏润藏深穴今向枯焦叹昊穹。 5:火云烧尽三春绿燹气蒸干九泽风。 6:莫道天威难测度人间斧凿亦神工。2.4 C语言风格使用双重括号(( ))让while循环更简洁。#!/bin/bashcount1while((count5));doechocount $count((count))done执行效果与2.1相同count 1 count 2 count 3 count 4 count 5三、until循环until与while相反while条件为真时执行until条件为假时执行#!/bin/bashcount1until[$count-gt5];doechocount $count((count))done执行效果xayahXayah:~$ ./until-demo1.sh count 1 count 2 count 3 count 4 count 5四、循环控制4.1 breakbreak用于跳出当前循环可以跟数字指定跳出几层循环。#!/bin/bashcount1until[$count-gt5];doforiin{1..5};doechoi $i# 当 i2 且 count3 时跳出两层循环if[$i-eq2][$count-eq3];thenbreak2fidoneechocount $count((count))done执行效果xayahXayah:~$ ./break-demo.sh i 1 i 2 i 3 i 4 i 5 count 1 i 1 i 2 i 3 i 4 i 5 count 2 i 1 i 24.2 continuecontinue跳过当前迭代同样支持数字指定跳过几层。#!/bin/bashcount0until[$count-gt3];do((count))echocount $countforiin{1..3};doechoi $i# 当 i2 且 count2 时跳过当前外层迭代if[$i-eq2][$count-eq2];thencontinue2fidonedone执行效果xayahXayah:~$ ./continue-demo.sh count 1 i 1 i 2 i 3 count 2 i 1 i 2 count 3 i 1 i 2 i 3 count 4 i 1 i 2 i 3五、注意事项5.1 for循环无法直接读取文件内容for循环遍历文件时只会读取文件名而不是文件内容。# 错误用法期望读取文件内容forlinein./poem.txt;doecho文件$linedone执行效果xayahXayah:~$ ./for-demo.sh 文件./poem.txt正确做法应使用while read循环读取文件内容。5.2 变量作用域管道中的while循环会在子shell中执行变量的修改不会影响父shell。#!/bin/bashcount0echo1 2 3|whilereadnum;do((count))doneechocount $count# 输出: count 0变量未改变解决方案使用进程替换或重定向。#!/bin/bashcount0whilereadnum;do((count))done(echo1 2 3)echocount $count# 输出: count 35.3 避免无限循环确保循环条件最终会变为假避免死循环。# 危险无限循环whiletrue;do# 缺少退出条件echo无限循环done# 安全加入退出条件whiletrue;doecho循环中...if[some_condition];thenbreakfisleep1done六、总结对比循环类型执行条件适用场景for遍历列表/序列已知循环次数或遍历集合while条件为真条件控制循环until条件为假等待条件变为真控制语句作用break n跳出n层循环continue n跳过n层循环的当前迭代选择合适的循环结构和控制语句能够使Shell脚本更加高效和易读。