乐闻世界logo
搜索文章和话题

Shell 脚本中常用的循环结构有哪些?如何使用 for、while 和 until 循环?

3月6日 21:33

Shell 脚本中常用的循环结构包括 for 循环、while 循环和 until 循环。

for 循环

基本语法

bash
for 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 循环

基本语法

bash
while 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 循环

基本语法

bash
until 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"

循环最佳实践

  1. 使用引号包裹变量: 防止空格和特殊字符问题
  2. 设置 IFS 处理特殊分隔符: IFS= read -r line
  3. 使用 break 和 continue 控制循环: 提高代码可读性
  4. 避免无限循环: 确保 while 和 until 循环有退出条件
  5. 使用 wait 等待后台进程: 确保所有任务完成
  6. 优先使用 C 风格 for 循环: 处理数字序列时更清晰
  7. 使用数组遍历: for item in "${array[@]}"
标签:Shell