Shell脚本-while循环语法结构
一、前言
在 Linux Shell 脚本编程中,循环结构是控制程序流程的重要手段之一。其中,while
循环因其灵活性和实用性,被广泛应用于日志监控、用户交互、定时任务、文件处理等场景。
本文将系统讲解 Shell 中 while
循环的语法结构,结合多个实用示例,帮助你掌握其用法,并避免常见错误。
二、while 循环的基本语法
while
循环的语法结构如下:
while [ 条件判断 ]
do# 循环体:执行的命令或语句
done
或者使用双括号(适用于数值比较):
while (( 条件表达式 ))
do# 循环体
done
🔁 执行逻辑:
- 先判断条件是否为真(返回状态码为 0)
- 如果为真,则执行
do
和done
之间的命令- 执行完后再次判断条件
- 直到条件为假时退出循环
三、while 循环的经典用法与案例
✅ 案例1:基本计数循环
打印从 1 到 5 的数字:
#!/bin/bashi=1
while [ $i -le 5 ]
doecho "当前数字: $i"i=$((i + 1)) # 注意:不能写成 i++,需使用算术扩展
done
✅ 输出:
当前数字: 1
当前数字: 2
当前数字: 3
当前数字: 4
当前数字: 5
📌 说明:
[ $i -le 5 ]
使用-le
表示“小于等于”$((i + 1))
是 Shell 中的算术运算方式
✅ 案例2:使用双括号简化数值判断
#!/bin/bashi=1
while (( i <= 5 ))
doecho "数字: $i"((i++)) # 双括号内可以直接使用 ++、--
done
✅ 优点:语法更简洁,支持 C 风格的自增/自减操作。
✅ 案例3:无限循环(常用于服务监控)
#!/bin/bashwhile true
doecho "监控中... $(date)"sleep 2 # 每隔2秒输出一次时间
done
🔁 这是一个典型的无限循环,常用于后台服务监控、日志轮询等场景。
📌 终止方式:按 Ctrl+C
中断。
✅ 案例4:读取文件内容(逐行处理)
while
循环常用于读取文件的每一行,是 Shell 脚本中最常见的用法之一。
假设有一个文件 data.txt
,内容如下:
apple
banana
cherry
使用 while read
读取并处理:
#!/bin/bashwhile read line
doecho "水果: $line"
done < data.txt
✅ 输出:
水果: apple
水果: banana
水果: cherry
📌 说明:
done < data.txt
表示将文件重定向给while
循环read line
每次读取一行并赋值给变量line
✅ 案例5:用户交互式输入
#!/bin/bashecho "请输入内容(输入 'quit' 退出):"while true
doread -p "输入: " inputif [ "$input" = "quit" ]; thenecho "退出程序"breakelseecho "你输入的是: $input"fi
done
✅ 使用
break
可以提前跳出循环。
四、while 循环的常见控制语句
语句 | 作用 |
---|---|
break | 立即退出整个 while 循环 |
continue | 跳过本次循环剩余部分,进入下一次判断 |
exit | 退出整个脚本(不仅仅是循环) |
示例:使用 continue
跳过偶数
i=1
while [ $i -le 10 ]
doif (( i % 2 == 0 )); then((i++))continuefiecho "奇数: $i"((i++))
done
✅ 输出:1, 3, 5, 7, 9
五、常见陷阱与注意事项
❌ 陷阱1:变量在管道中的作用域问题
错误写法:
count=0
echo -e "a\nb\nc" | while read line
docount=$((count + 1))echo $line
done
echo "总数: $count" # 输出:0
❗ 问题:管道
|
会创建子 shell,while
内部修改的变量在外部不可见。
✅ 正确做法:使用重定向方式
count=0
while read line
docount=$((count + 1))echo $line
done <<< "$(echo -e 'a\nb\nc')"
echo "总数: $count" # 输出:3
或者使用临时文件或 here-string。
❌ 陷阱2:忘记更新循环变量导致死循环
i=1
while [ $i -le 5 ]
doecho $i# 忘记写 i=$((i+1)),导致无限输出 1
done
📌 建议:写完 while
循环后,立即检查是否有变量更新逻辑。
❌ 陷阱3:条件判断语法错误
- 错误:
while [ i -lt 10 ]
(缺少$
) - 正确:
while [ $i -lt 10 ]
- 或者使用:
while (( i < 10 ))
六、总结对比表
语法形式 | 适用场景 | 特点 |
---|---|---|
while [ condition ] | 字符串、文件、基本条件判断 | 使用 [ ] 或 [[ ]] |
while (( condition )) | 数值比较、算术表达式 | 支持 ++, --, <, > 等 |
while true | 无限循环 | 配合 break 使用 |
while read ... | 读取文件或输入流 | 常用于文本处理 |
while ...; do ...; done < file | 文件重定向读取 | 推荐方式,避免子 shell 问题 |
七、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!