for 循环是 Linux Shell 中最常用的结构。for 循环主要有两种常用的结构:第一种结构是列表 for 循环;第二种结构是 C 语言风格的 for 循环。
1、列表for循环结构
列表 for 循环语句用于将一组命令执行已知的次数,语句基本格式如下:
for variable in (list)
do
commands
done
do 和 done 之间的命令成为循环体,执行次数和 list 列表中常数或字符串的个数相同。
list 参数中提供了迭代中需要使用的值,当执行 for 循环时,首先将 in 后的 list 列表的第一个常数或字符串赋给循环变量,然后执行循环体;接着将 list 列表中的第二个常数或字符串赋值给循环变量,再次执行循环体。这个过程将一直持续到 list 列表中无其他常数或字符串,然后执行 done 命令后的命令序列。
注意,在 for 循环中,参数列表可以是数字,也可以是字符串,但是输入是以空格进行分隔的,如果存在空格,脚本执行时会认为存在另一个参数。
【例 1】参数列表为常数。
使用 vim 编辑器打开脚本文件 ,输入 i 命令进入插入模式,输入以下命令:
#!/bin/bash
for var in 1 2 3 4
do
echo "$var:"
done
使用 sh(Bash)进程来执行脚本文件,输出结果为:
[root@bogon ~]# sh
1:
2:
3:
4:
【例 2】用字符串表示列表。
使用 vim 编辑器打开脚本文件 ,输入 i 命令进入插入模式,输入以下命令:
#!/bin/bash
for day in Mon Tues Wed Thurs
do
echo "$day:"
done
使用 sh(Bash)进程来执行脚本文件,输出结果为:
[root@bogon ~]# sh
Mon:
Tues:
Wed:
Thurs:
2、C语言风格for循环
C 语言风格的 for 循环会定义一个在每次迭代时自动改变的变量,通常将这个变量用作计时器,并且会让计数器在每次迭代中增加或减少。Bash中的 for 循环和 C 语言中的 for 循环类似。
Bash 中 C 语言风格的 for 循环的基本格式如下:
for ((variable assignment;condition;interation process))
do
commands
done
使用类 C 风格 for 循环要注意以下事项:
如果循环条件最初的退出状态为非 0,则不会执行循环体。
当执行更新语句时,如果循环条件的退出状态永远为 0,则 for 循环将永远执行下去,从而产生死循环。
Shell 中不运行使用非整数类型的数作为循环变量。
如果循环体中的循环条件被忽略,则默认的退出状态为 0。
在类 C 风格的 for 循环中,可以将三个语句全部忽略。例如:
for((; ;))
do
echo "hello"
done
【例 3】直接输出。
使用 vim 编辑器打开脚本文件 ,输入 i 命令进入插入模式,输入如下命令:
#!/bin/bash
for (( i=1; i <= 5;i++))
do
echo "This is $i"
done
使用 sh(Bash)进程来执行脚本文件,输出结果为:
[root@bogon ~]# sh
This is 1
This is 2
This is 3
This is 4
This is 5
C 语言风格的 for 循环也允许使用多个变量,循环会单独处理每个变量,因此可以为每个变量定义不同的迭代过程。
【例 4】多个变量的使用。
使用 vim 编辑器打开脚本文件 ,输入 i 命令进入插入模式,输入如下命令:
#!/bin/bash
for (( a=1,b=10; a <= 10;a++,b--))
do
echo "$a-$b"
done
使用 sh(Bash)进程来执行脚本文件,输出结果为:
[root@bogon ~]# sh
1-10
2-9
3-8
4-7
5-6
6-5
7-4
8-3
9-2
10-1
注意,尽管可以使用多个变量,但只能在 for 循环中定义一种条件。