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 |
---|---|---|
作用 | 终止整个循环 | 跳过当前迭代,继续下一次循环 |
范围 | 可以指定跳出多层循环 | 可以指定跳过多层循环的迭代 |
用途 | 完全停止循环 | 控制循环内某些条件下的跳过行为 |