Shell:循环

在Shell脚本编程中,循环是一种基本的控制结构,它允许你重复执行一段代码直到满足某个条件为止。Shell脚本支持多种循环结构,主要包括for循环、while循环和until循环。下面详细解释这三种循环结构的使用方法和特点。

1. for循环

for循环用于在Shell脚本中重复执行一系列命令,直到列表中的每个项目都被处理过。for循环有两种基本形式:C语言风格的for循环和Shell风格的for循环。

C语言风格的for循环

1
2
3
4
for (( 初始化表达式; 条件表达式; 步进表达式 ))  
do  
    # 命令列表  
done

例如:

1
2
3
4
for (( i=1; i<=5; i++ ))  
do  
    echo "Number $i"  
done

Shell风格的for循环

1
2
3
4
for 变量 in 列表  
do  
    # 命令列表  
done

列表可以是一系列值,也可以是通过命令生成的。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
for i in 1 2 3 4 5  
do  
    echo "Number $i"  
done  
  
# 或者使用命令生成的列表  
for file in $(ls *.txt)  
do  
    echo "Processing $file"  
done

当后面循环的数字是一个区间时

2. while循环

while循环在给定条件为真时重复执行命令块。条件通常在循环开始前评估,并在每次迭代开始时重新评估。

1
2
3
4
while [ 条件表达式 ]  
do  
    # 命令列表  
done

例如:

1
2
3
4
5
6
counter=1  
while [ $counter -le 5 ]  
do  
    echo "Number $counter"  
    ((counter++))  
done

3. until循环

until循环与while循环相反,它在给定条件为假时重复执行命令块。这意味着循环体至少会执行一次,因为条件在循环开始前评估。

1
2
3
4
until [ 条件表达式 ]  
do  
    # 命令列表  
done

例如:

1
2
3
4
5
6
counter=1  
until [ $counter -gt 5 ]  
do  
    echo "Number $counter"  
    ((counter++))  
done

遍历区间的几种写法

在Shell脚本中,循环遍历一个区间(即一系列的数字)通常可以通过for循环来实现。这里有两种常见的做法,一种是使用C语言风格的for循环,另一种是使用Shell风格的for循环与seq命令(或者Bash的内置功能,如{start..end})结合。

1. 使用C语言风格的for循环

C语言风格的for循环在Shell脚本中也可以直接使用,特别适用于需要遍历一个已知范围的整数序列。

1
2
3
4
5
6
#!/bin/bash  
  
for (( i=1; i<=5; i++ ))  
do  
    echo "Number $i"  
done

在这个例子中,循环变量i从1开始,到5结束,每次循环增加1。

2. 使用Shell风格的for循环与seq命令

如果你使用的是较老的Shell环境或者想要一个更通用的解决方案,可以使用seq命令生成一个数字序列,并通过Shell风格的for循环遍历它。

1
2
3
4
5
6
#!/bin/bash  
  
for i in $(seq 1 5)  
do  
    echo "Number $i"  
done

seq 1 5生成了一个从1到5的数字序列,然后for循环遍历这个序列。

3. Bash特有的{start..end}语法

在Bash中,你还可以使用{start..end}这种简洁的语法来生成一个数字序列。

1
2
3
4
5
6
#!/bin/bash  
  
for i in {1..5}  
do  
    echo "Number $i"  
done

这个例子的效果与前面两个例子相同,但是语法更加简洁,不过请注意,这种语法是Bash特有的,不是所有Shell都支持。

总结

  • 使用C语言风格的for循环是遍历固定区间的一个直观且强大的方法。
  • seq命令提供了一种跨Shell的通用解决方案,但可能不如Bash内置的功能高效。
  • Bash的{start..end}语法简洁且高效,但仅限于Bash环境。

总结

  • for循环适用于已知迭代次数或迭代集合的场景。
  • while循环适用于循环次数未知,但知道何时停止的场景。
  • until循环与while循环相反,适用于循环次数未知,但知道何时开始的场景(虽然它至少会执行一次)。

选择合适的循环结构对于编写高效、可读的Shell脚本至关重要。

0%