等待MySQL服务启动的过程最长持续30秒,系统会持续检查服务状态,若在此期间成功启动则继续后续操作,若超过30秒仍未启动,则判定为超时失败,需排查服务启动问题。
For循环:精确控制迭代次数
适用场景:批量重命名文件、遍历目录、执行固定次数的操作
基本语法:
for 变量 in 列表
do
命令
done
实用示例:
-
批量修改文件扩展名(将.txt转为.md):
for file in *.txt; do mv "$file" "${file%.txt}.md" done${file%.txt}表示删除.txt后缀。 -
遍历数字序列(创建5个日志文件):
for i in {1..5}; do touch "log_$i.log" done -
处理带空格的文件名(安全方式):
find ~/docs -name "*.pdf" | while read -r file; do echo "处理文件: $file" done
使用
find+while read避免空格导致的解析错误。
While循环:条件持续时执行
适用场景:监控进程、读取文件内容、条件满足时重复操作
基本语法:
while [ 条件 ]
do
命令
done
关键示例:
-
实时监控内存使用(每3秒刷新):
while true; do free -h | grep "Mem" sleep 3 done
按
Ctrl+C退出循环。 -
逐行读取文件内容:
while IFS= read -r line; do echo "行内容: $line" done < config.txt
IFS=保留行首/尾空格,-r防止转义符被解析。
Until循环:条件不满足时执行
适用场景:等待服务启动、超时检测
基本语法:
until [ 条件 ]
do
命令
done
典型用例:
until systemctl is-active mysql >/dev/null || [ $timeout -le 0 ]; do
sleep 1
((timeout--))
done
若超时仍未启动则退出循环。
循环控制语句
-
中断循环:
breakfor i in {1..10}; do if [ $i -eq 5 ]; then break # 当i=5时跳出循环 fi echo $i done -
跳过当前迭代:
continuefor num in 1 2 3 "error" 4; do if [ "$num" = "error" ]; then continue # 跳过"error"继续下一轮 fi echo "数字: $num" done
安全操作指南
- 测试循环逻辑:
在关键操作前添加echo预览命令(如echo mv "$file" ...),确认无误后移除echo。 - 处理特殊字符:
变量始终用双引号包裹(如"$file"),防止文件名含空格时出错。 - 避免无限循环:
while true场景下,务必设置退出条件(如超时机制或用户中断)。 - 权限管理:
涉及系统文件时,使用sudo并明确权限范围(如sudo chmod)。
进阶技巧
-
并行执行加速:
for i in {1..10}; do (sleep $i; echo "任务$i完成") & done wait # 等待所有后台任务结束添加
&将任务放入后台,wait同步结果。 -
结合xargs批量处理:
find /var/log -name "*.log" -print0 | xargs -0 grep "ERROR"
替代循环搜索文件,效率更高。
引用说明: 参考GNU Bash官方手册、Ubuntu Manpage仓库及Linux命令行最佳实践,操作前建议在测试环境验证,生产环境谨慎执行高危命令。
通过灵活组合循环与控制语句,可大幅提升Ubuntu系统管理效率,建议通过 man bash 深入学习语法细节,或使用 bash -x script.sh 调试脚本执行过程。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/6111.html