Linux中while循环本质是“条件驱动型”执行:只要测试条件为真(退出状态码为0)就持续运行循环体,条件为假立即退出;它不依赖预设次数,靠动态判断决定是否继续,适合不确定执行轮次的任务。

Linux 中的 while 循环本质是“条件驱动型”执行:只要测试条件为真(退出状态码为 0),就持续运行循环体内的命令;一旦条件变假,立即退出。它不依赖预设次数,而是靠动态判断决定是否继续,特别适合处理不确定执行轮次的任务。
基础结构与关键规则
标准语法如下:
while [ 条件 ]; do
命令1
命令2
done-
条件必须有空格:例如
[ $i -lt 10 ]中,[、$i、-lt、10、]之间都要留空格,否则报错。 -
变量必须在循环内更新:比如用
i=$((i+1))或((i++))修改计数器,否则会卡死在无限循环。 - done 不可省略:它是语法闭合标志,缺了 shell 会提示 “unexpected end of file”。
常见实用场景与写法
逐行读取文件(最安全方式)
推荐使用 IFS= read -r 防止空格截断和反斜杠误转义:
while IFS= read -r line; do
echo "处理:$line"
done < input.txt等待某个事件发生
比如等文件生成、端口就绪或进程启动:
while [ ! -f /tmp/ready.flag ]; do
echo "等待标记文件..."
sleep 2
done监控服务状态(每秒检查)
配合 pgrep 或 systemctl is-active:
while ! pgrep nginx >/dev/null; do
sleep 1
done
echo "nginx 已运行"避免死循环的实用技巧
有时需要无限循环,但必须预留退出路径:
- 用
while true或while :启动死循环; - 在循环体内用
break或exit控制退出时机; - 加入超时保护,防止意外卡住:
timeout=60
start=$(date +%s)
while true; do
if [ $(($(date +%s) - start)) -ge $timeout ]; then
echo "超时退出"
break
fi
# 执行检查逻辑...
sleep 1
done嵌套与组合用法
可以和其他命令或循环配合使用,例如:
- 外层
for遍历多个日志文件,内层while逐行分析每份内容; - 用
while读取用户输入,配合case分支处理不同指令; - 结合
continue跳过空行或注释行:
while IFS= read -r line; do
[[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
echo "有效内容:$line"
done < config.conf


















