for循环
在 Shell 脚本中,for 循环是一种常见的循环结构,用于遍历列表、数组或命令输出。
基本语法
for 循环的基本语法如下:
#!/bin/bash
for variable in list
docommands
done
- variable是一个临时变量,用于存储每次迭代中的当前项。
- list可以是空格分隔的值、文件名、命令输出等。
- commands是循环体中要执行的命令。
简单示例
遍历列表
#!/bin/bash
for color in red green blue
doecho "Color: $color"
done
运行输出:
Color: red
Color: green
Color: blue
遍历数字范围
可以使用 Brace Expansion 或 seq 命令来生成数字范围。
使用 Brace Expansion
#!/bin/bash
for i in {1..5}
doecho "Number: $i"
done
使用 seq 命令
 
#!/bin/bash
for i in $(seq 1 5)
doecho "Number: $i"
done
遍历数组
定义和遍历数组
#!/bin/bash
fruits=("apple" "banana" "cherry")for fruit in "${fruits[@]}"
doecho "Fruit: $fruit"
done
使用命令输出进行循环
可以将命令输出作为列表来进行循环。
遍历文件名
#!/bin/bash
for file in $(ls)
doecho "File: $file"
done
遍历命令输出
#!/bin/bash
for user in $(cut -d: -f1 /etc/passwd)
doecho "User: $user"
done
嵌套 for 循环
 
可以在 for 循环中嵌套另一个 for 循环。
#!/bin/bash
for i in {1..3}
dofor j in {a..c}doecho "Combination: $i$j"done
done
运行输出:
Combination: 1a
Combination: 1b
Combination: 1c
Combination: 2a
Combination: 2b
Combination: 2c
Combination: 3a
Combination: 3b
Combination: 3c
示例脚本
计算文件总大小
计算当前目录中所有文件的总大小。
#!/bin/bash
total_size=0for file in $(ls)
doif [ -f $file ]; thensize=$(stat -c%s "$file")total_size=$((total_size + size))fi
doneecho "Total size: $total_size bytes"
生成乘法表
生成一个简单的乘法表。
#!/bin/bash
for i in {1..9}
dofor j in {1..9}doresult=$((i * j))echo -n "$i*$j=$result "doneecho ""
done
while 循环
while 循环是 Shell 脚本中常用的循环结构之一。它用于在条件为真时反复执行一组命令。
基本语法
while 循环的基本语法如下:
#!/bin/bash
while [ condition ]
docommands
done
- condition是一个测试条件,当条件为真(返回状态为 0)时,循环继续执行。
- commands是循环体中的命令。
简单示例
打印数字
使用 while 循环打印 1 到 5 的数字:
#!/bin/bash
count=1
while [ $count -le 5 ]
doecho "Number: $count"count=$((count + 1))
done
运行输出:
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5
无限循环
可以创建一个无限循环,直到满足某个条件时使用 break 退出:
#!/bin/bash
while true
doecho "This is an infinite loop. Press Ctrl+C to stop."sleep 1
done
读取用户输入
使用 while 循环读取用户输入,直到输入 exit 时退出循环:
#!/bin/bash
input=""
while [ "$input" != "exit" ]
doecho "Enter something (type 'exit' to quit):"read inputecho "You entered: $input"
done
从文件读取行
使用 while 循环逐行读取文件内容:
#!/bin/bash
filename="test.txt"
while IFS= read -r line
doecho "Line: $line"
done < "$filename"
嵌套 while 循环
 
可以在 while 循环中嵌套另一个 while 循环:
#!/bin/bash
outer=1
while [ $outer -le 3 ]
doinner=1while [ $inner -le 3 ]doecho "Outer: $outer, Inner: $inner"inner=$((inner + 1))doneouter=$((outer + 1))
done
运行输出:
Outer: 1, Inner: 1
Outer: 1, Inner: 2
Outer: 1, Inner: 3
Outer: 2, Inner: 1
Outer: 2, Inner: 2
Outer: 2, Inner: 3
Outer: 3, Inner: 1
Outer: 3, Inner: 2
Outer: 3, Inner: 3
实际示例
下载文件直到成功
尝试下载文件,直到成功为止:
#!/bin/bash
url="http://example.com/file.zip"
output="file.zip"while ! curl -O $url
doecho "Download failed, retrying in 5 seconds..."sleep 5
doneecho "Download completed."
until循环
在 Shell 脚本 中,until 循环是一种条件循环结构,它用于在条件未满足(条件为 false)时重复执行代码块。一旦条件满足(即变为 true),循环将终止。
until 循环是 while 循环的反向逻辑:
- while循环:当条件为- true时执行循环体。
- until循环:当条件为- false时执行循环体。
语法格式
until [ 条件 ]
do# 循环体:当条件为false时执行命令
done
- until后面的条件被测试:- 如果条件为 false,执行 do块中的代码。
- 每次循环结束后,重新测试条件,直到条件为 true 时终止循环。
 
- 如果条件为 false,执行 
基本示例
示例:简单的计数器
#!/bin/bash
# 使用 until 循环打印1到5的数字count=1until [ $count -gt 5 ]; doecho "Count: $count"((count++))  # 增加计数器
doneecho "Loop finished."
输出结果:
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5
Loop finished.
解析:
- 初始值 count=1。
- 条件 [ $count -gt 5 ]表示 “count 大于 5”。
- 在 count <= 5的情况下,条件为false,因此执行循环体。
- 每次循环后,count递增 1。
- 当 count > 5时,条件为true,循环结束。
使用 until 循环读取用户输入
 
#!/bin/bash
# 直到用户输入 "yes" 才终止循环input=""until [ "$input" == "yes" ]; doread -p "请输入 'yes' 来退出循环: " input
doneecho "你输入了 'yes',循环结束。"
输出:
请输入 'yes' 来退出循环: no
请输入 'yes' 来退出循环: maybe
请输入 'yes' 来退出循环: yes
你输入了 'yes',循环结束。
解析:
- read命令用于从用户输入中读取数据。
- until循环判断用户输入是否等于- "yes",直到条件满足为止。
until 循环与 break 结合使用
 
你可以使用 break 命令在 until 循环中提前终止循环。
#!/bin/bash
count=1until [ $count -gt 10 ]; doecho "Count: $count"if [ $count -eq 5 ]; thenecho "提前终止循环"breakfi((count++))
doneecho "循环结束"
输出:
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5
提前终止循环
循环结束
解析:
- 当 count等于 5 时,break命令强制终止循环。
until 循环与 continue 结合使用
 
continue 命令用于跳过当前迭代,继续下一次循环。
#!/bin/bash
count=0until [ $count -ge 5 ]; do((count++))if [ $((count % 2)) -eq 0 ]; thencontinue  # 跳过偶数fiecho "Odd Count: $count"
done
输出:
Odd Count: 1
Odd Count: 3
Odd Count: 5
解析:
- continue跳过偶数的输出,只显示奇数值。
while 与 until 的对比
 
| 特性 | while循环 | until循环 | 
|---|---|---|
| 执行条件 | 条件为 true 时执行 | 条件为 false 时执行 | 
| 执行逻辑 | 反复执行直到条件变为 false | 反复执行直到条件变为 true | 
| 使用场景 | 已知条件满足时,继续执行任务 | 直到特定条件满足时才停止任务 | 
| 示例条件 | [ $count -le 5 ](小于等于5时) | [ $count -gt 5 ](大于5时停止) | 
示例对比:
- while循环:
count=1
while [ $count -le 5 ]; doecho $count((count++))
done
- until循环:
count=1
until [ $count -gt 5 ]; doecho $count((count++))
done
两者的输出是相同的,但逻辑的书写顺序相反。
break 和 continue
 
在Shell脚本中,break 和 continue 是用于控制循环流的关键字。它们可以用于 for、while 和 until 循环中,以改变程序的执行顺序。
break 命令
 
break 命令用于终止当前所在的循环结构。它会立即跳出当前的循环,无论循环条件是否还满足。
语法:
break [n]
- n是可选的,表示跳出第- n层的循环。- n = 1(默认值):跳出当前循环。
- n > 1:跳出外层的多重循环。
 
使用示例:
示例1:跳出单层循环
#!/bin/bash
for i in {1..5}; doecho "Number: $i"if [ $i -eq 3 ]; thenecho "Breaking out of loop."breakfi
done
echo "Loop terminated."
输出:
Number: 1
Number: 2
Number: 3
Breaking out of loop.
Loop terminated.
解释:当 i 等于3时,break 会终止整个循环。
示例2:跳出多层循环
#!/bin/bash
for i in {1..3}; dofor j in {1..3}; doecho "i=$i, j=$j"if [ $j -eq 2 ]; thenbreak 2  # 跳出两层循环fidone
done
echo "Exited both loops."
输出:
i=1, j=1
i=1, j=2
Exited both loops.
解释:break 2 跳出所有嵌套的循环结构。
continue 命令
 
continue 命令用于跳过当前循环中的剩余部分,直接进入下一次循环的开始处。它不会终止整个循环,而是继续执行下一个迭代。
语法:
continue [n]
- n是可选的,表示跳过当前第- n层循环的剩余部分。- n = 1(默认值):跳过当前循环的当前迭代。
- n > 1:跳过外层的多重循环。
 
使用示例:
示例1:跳过单层循环的迭代
#!/bin/bash
for i in {1..5}; doif [ $i -eq 3 ]; thenecho "Skipping number: $i"continuefiecho "Number: $i"
done
输出:
Number: 1
Number: 2
Skipping number: 3
Number: 4
Number: 5
解释:当 i 等于3时,continue 跳过当前迭代,输出 Number: 3 被跳过。
示例2:跳过嵌套循环中的某层迭代
#!/bin/bash
for i in {1..3}; dofor j in {1..3}; doif [ $j -eq 2 ]; thenecho "Skipping inner loop when j=$j"continue 2  # 跳过外层循环的当前迭代fiecho "i=$i, j=$j"done
done
输出:
i=1, j=1
Skipping inner loop when j=2
i=2, j=1
Skipping inner loop when j=2
i=3, j=1
Skipping inner loop when j=2
解释:continue 2 使外层循环跳过当前迭代,而不仅仅是内层循环。
break 和 continue 的区别
 
| 功能 | break | continue | 
|---|---|---|
| 作用 | 终止整个循环 | 跳过当前迭代,继续下一次循环 | 
| 范围 | 可以指定跳出多层循环 | 可以指定跳过多层循环的迭代 | 
| 用途 | 完全停止循环 | 控制循环内某些条件下的跳过行为 |