for、while、until是Shell三大循环:for适用于已知范围的批量操作,while用于条件成立时持续执行,until在条件不成立时重复运行;三者常组合使用以提升脚本可读性与健壮性。

Shell脚本中,for、while 和 until 是三种核心循环结构,各自适用于不同场景:for 适合已知迭代范围的批量操作,while 适合条件成立时持续执行,until 则在条件不成立时重复运行。选对结构,能显著提升脚本的可读性与健壮性。
for 循环:处理确定集合的批量任务
for 最常用于遍历列表、文件、命令输出或数字序列,语法简洁,适合“对每个元素做某事”的场景。
- 基础格式:
for var in list; do commands; done,list 可以是空格分隔的字符串、通配符(如 *.log)、或命令替换(如$(ls)) - 遍历数字范围推荐用
{1..5}或$(seq 1 3 10)(从1到10步长3),避免手动写 1 2 3… - 注意字段分隔:默认按空白符(空格、制表符、换行)切分,含空格的文件名易出错;稳妥做法是配合
find -print0与while IFS= read -r -d ''(见下文)
while 循环:基于条件持续处理流式数据
while 在每次循环前判断条件,适合读取文件行、监控状态、或处理未知长度的输入流。
- 读文件推荐方式:
while IFS= read -r line; do echo "$line"; done ,<code>IFS=保留行首尾空格,-r防止反斜杠转义 - 配合管道使用:
ps aux | grep nginx | while read -r proc; do echo "Found: $proc"; done,但注意管道中的 while 会启动子 shell,变量修改无法回传父脚本 - 可用
while true; do ... sleep 1; done实现轮询,务必加sleep防止 CPU 占满
until 循环:条件满足前反复尝试
until 逻辑与 while 相反——当条件为假时执行循环体,天然适合“等待某事发生”或“重试直到成功”的场景。
- 典型用法:
until ping -c1 example.com &>/dev/null; do echo "Waiting..."; sleep 2; done,等待网络就绪 - 可搭配计数防死循环:
count=0; until [ $count -ge 5 ] || some_command; do ((count++)); sleep 1; done - 注意条件写法:
until [ -f /tmp/ready ]; do ... done表示“直到文件存在才停止”,比while [ ! -f /tmp/ready ]更直观
实际批量处理建议
真实运维中,三者常组合使用。例如清理过期日志:
- 先用
find /var/log -name "*.log" -mtime +7 -print0安全列出文件 - 再用
while IFS= read -r -d '' file; do rm "$file"; echo "Deleted: $file"; done逐个处理 - 若删除失败,内部可嵌套
until重试三次,或用for遍历预定义的备份目录做归档
不复杂但容易忽略。


















