当前位置: 首页 > news >正文

【Shell 脚本编程】详细指南:第四章 - 循环结构(for、while、until) 深度解析

Shell 脚本编程详细指南:第四章 - 循环结构(for、while、until) 深度解析

引言:循环在自动化中的核心作用

循环结构是Shell脚本实现自动化和批量处理的核心工具。本章将全面解析三种循环结构及其高级用法,帮助您掌握数据处理、任务自动化的关键技术。我们将从基础语法入手,逐步深入实际应用场景和性能优化技巧。

目录结构

  1. for循环的全面应用
  2. while循环的深度解析
  3. until循环的特殊场景
  4. 循环控制与优化技巧
  5. 实战案例解析
  6. 性能考量与最佳实践

1. for循环的全面应用

1.1 三种for循环语法对比

类型语法格式适用场景示例
列表遍历for var in list; do已知元素集合文件处理、参数遍历
数字范围for i in {start..end}; do固定次数循环数字序列生成
C风格for ((exp1; exp2; exp3))复杂计数器控制多维数组处理

1.2 实际应用示例

文件批量处理:

# 重命名所有.txt文件为.bak
for file in *.txt; domv "$file" "${file%.txt}.bak"
done

多目录操作:

dirs=("/var/log" "/tmp" "/etc")
for dir in "${dirs[@]}"; doecho "处理目录: $dir"find "$dir" -type f -name "*.tmp" -delete
done

带步长的数字序列:

# Bash 4.0+ 支持步长
for i in {0..10..2}; do  # 0 2 4 6 8 10echo $i
done

2. while循环的深度解析

2.1 while循环控制模式

标准模式:

while [ condition ]; docommands
done

无限循环实现:

while true; docommandsif [ condition ]; thenbreakfi
done

读取文件内容:

while IFS= read -r line; doecho "处理行: $line"
done < "filename.txt"

2.2 实际应用案例

监控进程是否存在:

process="nginx"
while pgrep -x "$process" >/dev/null; doecho "进程 $process 仍在运行..."sleep 5
done
echo "进程已退出"

用户输入验证:

while true; doread -p "请输入Y/N: " inputcase $input in[Yy]*) break;;[Nn]*) exit 0;;*) echo "无效输入";;esac
done

3. until循环的特殊场景

3.1 until与while对比

循环类型逻辑条件典型应用场景
while条件为真时执行持续监控、事件等待
until条件为真时停止系统初始化、服务等待

3.2 实际应用示例

等待服务启动:

until curl -sf http://localhost:8080/health; doecho "等待服务启动..."sleep 3
done

超时控制实现:

timeout=60
start_time=$(date +%s)until [ $(($(date +%s) - start_time)) -gt $timeout ]; doif check_condition; thenbreakfisleep 1
done

4. 循环控制与优化技巧

4.1 循环控制命令

命令作用示例
break退出整个循环breakbreak 2(嵌套)
continue跳过本次迭代continue
exit退出整个脚本exit 1

4.2 性能优化技巧

减少子进程创建:

# 低效方式(每次循环创建子进程)
while [ $(wc -l < file) -gt 0 ]; do# 高效方式(使用变量)
line_count=$(wc -l < file)
while [ $line_count -gt 0 ]; do

并行处理加速:

for file in *.log; do{process_file "$file"} &
done
wait  # 等待所有后台任务完成

5. 实战案例解析

案例1:日志分析脚本

#!/bin/bash
# log_analyzer.shdeclare -A error_counts
log_files=(/var/log/*.log)for log_file in "${log_files[@]}"; doecho "分析文件: $log_file"while IFS= read -r line; doif [[ "$line" =~ [Ee][Rr][Rr][Oo][Rr] ]]; then((error_counts["$log_file"]++))fidone < "$log_file"
doneecho "===== 错误统计 ====="
for file in "${!error_counts[@]}"; doprintf "%-30s: %4d\n" "$file" "${error_counts[$file]}"
done

案例2:系统健康检查

#!/bin/bash
# health_check.shthreshold=90
check_interval=300  # 5分钟while true; do# 获取CPU和内存使用率cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')mem_usage=$(free | awk '/Mem/{printf("%.0f"), $3/$2*100}')# 报警检查if (( $(echo "$cpu_usage > $threshold" | bc -l) )); thensend_alert "CPU使用率过高: $cpu_usage%"fiif [ "$mem_usage" -gt "$threshold" ]; thensend_alert "内存使用率过高: $mem_usage%"fisleep $check_interval
done

6. 性能考量与最佳实践

6.1 循环效率对比测试

循环类型10万次迭代时间适用场景
for ((i=0;…))0.12s高性能数字循环
for i in {1…N}0.15s简单数字范围
while read0.18s文件逐行处理
for item in $()0.25s命令输出处理

6.2 必须遵循的最佳实践

  1. 变量引用安全:

    for file in *; do  # 危险:可能匹配不到文件
    for file in ./*; do  # 安全:明确路径
    
  2. 大文件处理优化:

    # 低效方式(整个文件加载到内存)
    for line in $(cat bigfile); do# 高效方式(流式处理)
    while IFS= read -r line; do
    
  3. 错误处理机制:

    while true; doif ! some_command; thenlog_error "命令执行失败"sleep 10continuefibreak
    done
    

进阶技巧

嵌套循环控制

for ((i=1; i<=3; i++)); dofor ((j=1; j<=3; j++)); doif ((i*j == 4)); thenbreak 2  # 跳出两层循环fiecho "i=$i, j=$j"done
done

循环重定向

for user in $(cut -d: -f1 /etc/passwd); doecho "处理用户: $user"
done > user_report.txt  # 整个循环输出重定向

本章总结

本章深入探讨了Shell脚本中的循环结构,重点包括:

  • 三种循环结构的语法对比与选择标准
  • 实际应用场景与性能优化技巧
  • 循环控制命令的高级用法
  • 大文件处理与并行化技术
  • 系统监控脚本等实战案例

🚀 下章预告:第五章将深入讲解函数开发,包括参数传递、返回值处理和模块化编程技巧,带您掌握Shell脚本的工程化开发能力。

互动练习:
编写一个脚本实现以下功能:

  1. 查找指定目录下所有超过30天未修改的.log文件
  2. 对这些文件进行gzip压缩
  3. 将压缩后的文件移动到/var/log/archives目录
  4. 记录处理日志(文件名、原始大小、压缩后大小)

欢迎在评论区分享您的实现方案!

相关文章:

  • 60常用控件_QSpinBox的使用
  • 排序算法——冒泡排序
  • C语言学习之动态内存的管理
  • 交我算使用保姆教程:在计算中心利用singularity容器训练深度学习模型
  • caffe适配cudnn9.6.0(ai修改代码踩坑)
  • synchronized与Lock深度对比
  • 随机森林实战:从原理到垃圾邮件分类
  • Windows下Python3脚本传到Linux下./example.py执行失败
  • AdaBoost算法详解:原理、实现与应用指南
  • 极简GIT使用
  • 补4月30日
  • 常见电源的解释说明
  • C#泛型集合深度解析(九):掌握System.Collections.Generic的核心精髓
  • RTOS接口-Semaphores
  • ADG网络故障恢复演练
  • 实现了一个基于寄存器操作STM32F103C8t6的工程, 并实现对PA1,PA2接LED正极的点灯操作
  • 如何提升个人的稳定性?
  • 蓝桥杯比赛
  • 基于BERT类的MRPC语义相似度检测(从0到-1系列)
  • 机箱结构的EMC设计
  • 准85后青海海北州副州长、州公安局局长李贤荣挂职临沂市副市长
  • 5月1日,全社会跨区域人员流动量完成33271.4万人次
  • 韩国前国务总理韩德洙正式宣布参加总统选举
  • 微博:严厉打击对肖某董某事件蹭炒热点、编造故事博流量等行为
  • 大学2025丨对话深大人工智能学院负责人李坚强:产学研生态比“造天才”更重要
  • 先去上海后赴北京,苏中城市泰州为何接连拥抱顶流“大城”?