Skip to content

循环

for 循环

基本语法

bash
for variable in list; do
    commands
done

遍历列表

bash
#!/bin/bash

for fruit in apple banana orange; do
    echo "水果: $fruit"
done

遍历数字范围

bash
#!/bin/bash

# 方式一:使用 {start..end}
for i in {1..5}; do
    echo "数字: $i"
done

# 方式二:使用 seq
for i in $(seq 1 5); do
    echo "数字: $i"
done

# 方式三:使用 C 风格
for ((i=1; i<=5; i++)); do
    echo "数字: $i"
done

遍历数组

bash
#!/bin/bash

arr=("apple" "banana" "orange")

for fruit in "${arr[@]}"; do
    echo "水果: $fruit"
done

遍历文件

bash
#!/bin/bash

# 遍历当前目录的文件
for file in *.txt; do
    echo "文件: $file"
done

# 遍历指定目录的文件
for file in /path/to/directory/*; do
    echo "文件: $file"
done

while 循环

基本语法

bash
while condition; do
    commands
done

基本示例

bash
#!/bin/bash

count=1

while [ $count -le 5 ]; do
    echo "计数: $count"
    count=$((count + 1))
done

读取文件

bash
#!/bin/bash

# 逐行读取文件
while IFS= read -r line; do
    echo "行: $line"
done < file.txt

无限循环

bash
#!/bin/bash

# 方式一
while true; do
    echo "无限循环"
    sleep 1
done

# 方式二
while :; do
    echo "无限循环"
    sleep 1
done

until 循环

基本语法

bash
until condition; do
    commands
done

基本示例

bash
#!/bin/bash

count=1

until [ $count -gt 5 ]; do
    echo "计数: $count"
    count=$((count + 1))
done

循环控制

break

bash
#!/bin/bash

for i in {1..10}; do
    if [ $i -eq 5 ]; then
        break
    fi
    echo "数字: $i"
done

continue

bash
#!/bin/bash

for i in {1..10}; do
    if [ $((i % 2)) -eq 0 ]; then
        continue
    fi
    echo "奇数: $i"
done

break 和 continue 结合

bash
#!/bin/bash

for i in {1..10}; do
    if [ $i -eq 5 ]; then
        continue
    fi
    if [ $i -eq 8 ]; then
        break
    fi
    echo "数字: $i"
done

嵌套循环

基本示例

bash
#!/bin/bash

for i in {1..3}; do
    for j in {1..3}; do
        echo "i=$i, j=$j"
    done
done

打印乘法表

bash
#!/bin/bash

for i in {1..9}; do
    for j in {1..9}; do
        printf "%d*%d=%-2d " $i $j $((i*j))
    done
    echo
done

实用示例

示例1:批量重命名文件

bash
#!/bin/bash

# 批量重命名文件
count=1
for file in *.txt; do
    new_name="file_$count.txt"
    mv "$file" "$new_name"
    echo "重命名: $file -> $new_name"
    count=$((count + 1))
done

示例2:查找大文件

bash
#!/bin/bash

# 查找大于 100MB 的文件
find /path/to/directory -type f -size +100M | while read file; do
    size=$(du -h "$file" | cut -f1)
    echo "大文件: $file ($size)"
done

示例3:监控进程

bash
#!/bin/bash

# 监控进程
while true; do
    if pgrep -x "nginx" > /dev/null; then
        echo "nginx 正在运行"
    else
        echo "nginx 未运行"
    fi
    sleep 5
done

示例4:倒计时

bash
#!/bin/bash

# 倒计时
for i in {10..1}; do
    echo -ne "倒计时: $i 秒\r"
    sleep 1
done
echo "倒计时结束!"

最佳实践

1. 使用双括号进行算术比较

bash
# 好的做法
for ((i=0; i<10; i++)); do
    echo $i
done

# 不好的做法
for i in $(seq 0 9); do
    echo $i
done

2. 使用引号

bash
# 好的做法
for file in *.txt; do
    echo "$file"
done

# 不好的做法
for file in *.txt; do
    echo $file
done

3. 避免无限循环

bash
# 好的做法
count=0
while [ $count -lt 10 ]; do
    echo $count
    count=$((count + 1))
done

# 不好的做法
while true; do
    echo "无限循环"
done

总结

循环的关键点:

  1. for 循环for variable in list; do ... done
  2. while 循环while condition; do ... done
  3. until 循环until condition; do ... done
  4. break:跳出循环
  5. continue:跳过本次循环
  6. 嵌套循环:在一个循环中嵌套另一个循环

下一节我们将学习 case 语句的使用。