linux shell循环有for、while、until三种,最常用for和while;for适用于已知次数的遍历,while适用于条件为真时重复执行,until适用于条件为假时重复执行。

Linux Shell 中的循环主要有 for、while 和 until 三种,最常用的是 for 和 while。写对循环关键在结构清晰、条件明确、避免死循环。
for 循环:遍历列表或范围
适合已知次数或明确要处理的项目(如文件、数字、字符串)。
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
- 基本语法:
for 变量 in 列表; do
命令序列
done - 常见用法举例:
• 遍历当前目录下所有 .txt 文件:
for file in *.txt; do echo "处理: $file"; done
• 遍历数字 1 到 5:
for i in {1..5}; do echo $i; done
• 用 seq 命令生成范围(兼容老版本 Shell):
for i in $(seq 1 2 10); do echo $i; done # 输出 1 3 5 7 9
while 循环:条件为真时重复执行
适合不确定执行次数、依赖状态变化的场景(如等待文件出现、读取输入、监控进程)。
- 基本语法:
while [ 条件 ]; do
命令序列
done - 关键点:
• 条件必须能被更新,否则会陷入死循环;
• 常用测试命令:[ -f file ](文件存在)、[ $n -lt 10 ](数值比较)、ps | grep xxx(进程检查);
• 示例:每秒检查 /tmp/ready 文件是否存在,最多等 30 秒:
n=0
while [ ! -f /tmp/ready ] && [ $n -lt 30 ]; do
sleep 1
n=$((n + 1))
done
until 循环:条件为假时重复执行
逻辑和 while 相反,适合“直到某事发生才停止”的情况,语义更直接。
- 基本语法:
until [ 条件 ]; do
命令序列
done - 上面的等待示例改用 until 更简洁:
n=0
until [ -f /tmp/ready ] || [ $n -eq 30 ]; do
sleep 1
n=$((n + 1))
done
(意思是:直到文件存在 或 超过 30 秒,就退出循环)
实用技巧与避坑提醒
- 循环体内修改变量时,注意作用域:Shell 中 for/while 内部变量默认全局有效,无需额外声明;
- 用
break提前退出循环,continue跳过本次剩余操作、进入下一次; - 调试时加
echo打印变量值,比如echo "当前 i=$i"; - 避免空列表导致 for 循环不执行(如
for f in $(ls *.log 2>/dev/null); do ...),可用shopt -s nullglob或先判断通配结果; - while 读文件建议用重定向而非管道,防止子 shell 导致变量失效:
while IFS= read -r line; do
echo "$line"
done (✅ 正确)
cat input.txt | while read line; do ... done(❌ 变量在子 shell 中,外部不可见)








