Shell 脚本中常用的循环结构包括 for 循环、while 循环和 until 循环。
for 循环
基本语法
bashfor variable in list do commands done
遍历列表
bash# 遍历字符串列表 for fruit in apple banana orange do echo "Fruit: $fruit" done # 遍历数字序列 for i in 1 2 3 4 5 do echo "Number: $i" done # 使用 seq 命令生成序列 for i in $(seq 1 10) do echo "Number: $i" done # 使用 {start..end} 语法(Bash 3.0+) for i in {1..10} do echo "Number: $i" done # 指定步长 for i in {0..10..2} do echo "Number: $i" done
C 风格 for 循环
bash# C 风格语法 for (( i=0; i<10; i++ )) do echo "Number: $i" done # 多变量 for (( i=0, j=10; i<10; i++, j-- )) do echo "i=$i, j=$j" done
遍历文件和目录
bash# 遍历当前目录下的文件 for file in *.txt do echo "Processing: $file" done # 遍历命令输出 for user in $(cut -d: -f1 /etc/passwd) do echo "User: $user" done # 递归遍历目录 for file in $(find . -name "*.sh") do echo "Shell script: $file" done
while 循环
基本语法
bashwhile condition do commands done
while 循环示例
bash# 计数器 count=0 while [ $count -lt 5 ] do echo "Count: $count" count=$((count + 1)) done # 读取文件行 while IFS= read -r line do echo "Line: $line" done < input.txt # 读取用户输入 while true do read -p "Enter 'quit' to exit: " input if [ "$input" = "quit" ]; then break fi echo "You entered: $input" done # 等待进程结束 while ps -p $PID > /dev/null do echo "Process is running..." sleep 1 done echo "Process finished"
until 循环
基本语法
bashuntil condition do commands done
until 循环示例
bash# 等待条件成立 count=0 until [ $count -ge 5 ] do echo "Count: $count" count=$((count + 1)) done # 等待服务启动 until curl -s http://localhost:8080 > /dev/null do echo "Waiting for service..." sleep 2 done echo "Service is ready"
循环控制语句
break 语句
bash# 跳出循环 for i in {1..10} do if [ $i -eq 5 ]; then break fi echo "Number: $i" done # 输出: 1 2 3 4
continue 语句
bash# 跳过当前迭代 for i in {1..10} do if [ $((i % 2)) -eq 0 ]; then continue fi echo "Odd number: $i" done # 输出: 1 3 5 7 9
break 和 continue 指定层级
bash# 跳出多层循环 for i in {1..3} do for j in {1..3} do if [ $i -eq 2 ] && [ $j -eq 2 ]; then break 2 fi echo "i=$i, j=$j" done done
实际应用示例
bash#!/bin/bash # 示例 1: 批量处理文件 echo "Processing text files..." for file in *.txt do if [ -f "$file" ]; then echo "Processing: $file" # 在这里添加处理逻辑 cp "$file" "backup_$file" fi done # 示例 2: 监控进程 echo "Monitoring process..." while true do if ps aux | grep -q "[m]yprocess"; then echo "Process is running" else echo "Process stopped" break fi sleep 5 done # 示例 3: 等待多个服务 services=("service1" "service2" "service3") for service in "${services[@]}" do echo "Waiting for $service..." until systemctl is-active --quiet "$service" do sleep 2 done echo "$service is ready" done # 示例 4: 读取配置文件 echo "Reading configuration..." while IFS='=' read -r key value do # 跳过注释和空行 [[ $key =~ ^#.*$ ]] && continue [[ -z $key ]] && continue echo "Config: $key = $value" done < config.txt # 示例 5: 并行处理 max_parallel=3 count=0 for task in task1 task2 task3 task4 task5 do # 启动后台任务 echo "Starting $task..." ( sleep 2 echo "$task completed" ) & count=$((count + 1)) # 控制并发数 if [ $((count % max_parallel)) -eq 0 ]; then wait fi done wait echo "All tasks completed"
循环最佳实践
- 使用引号包裹变量: 防止空格和特殊字符问题
- 设置 IFS 处理特殊分隔符:
IFS= read -r line - 使用 break 和 continue 控制循环: 提高代码可读性
- 避免无限循环: 确保 while 和 until 循环有退出条件
- 使用 wait 等待后台进程: 确保所有任务完成
- 优先使用 C 风格 for 循环: 处理数字序列时更清晰
- 使用数组遍历:
for item in "${array[@]}"