语法如下:
- for variable in {list}
- do
- statement1
- ...
- done
在上面的语法中,variable称为循环变量,list是一个列表,可以是一系列数字或者字符串,元素之间用空格隔开,do和done之间的结构称为循环体。
下面举几个示例:
- #!/bin/bash
-
- for var in 1 2 3 4 5 6
- do
- printf "$var"; printf " "
- done
-
- echo
-
- for var in {1..6}
- do
- printf "$var"; printf " "
- done
-
- echo
-
- for day in Mon Tue Wed Thu Fri Sat Sun
- do
- printf "$day"; printf " "
- done
-
- echo
-
- for day in { Mon Tue Wed Thu Fri Sat Sun }
- do
- printf "$day"; printf " "
- done
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-1.sh
1 2 3 4 5 6
1 2 3 4 5 6
Mon Tue Wed Thu Fri Sat Sun
{ Mon Tue Wed Thu Fri Sat Sun }
注意字符串不能用{}花括号括起来表示列表。
上述例子中for循环的步长都是1,实际上,Shell允许用户自己设置步长,语法如下:
- for variable in {start..end..step}
- do
- statement1
- ...
- done
start表示起始值,end表示终止值,step表示步长
下面看示例:
- #!/bin/bash
-
- sum=0
- for i in {1..100..2}
- do
- ((sum+=i))
- done
- echo "$sum"
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-2.sh
2500
for语句是list也可以是Shell命令输出的结果,比如ls命令会输出一个list
当前ls的命令输出如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ls
5-1.sh 5-2.sh 5-3.sh
Shell代码如下:
- #!/bin/bash
- for file in `ls`
- do
- echo "$file"
- done
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-3.sh
5-1.sh
5-2.sh
5-3.sh
还有使用通配符*作为条件列表的,这个*号的作用就是列出当前目录中的所有文件,代码如下:
- #!/bin/bash
- for file in *
- do
- echo "$file"
- done
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-4.sh
5-1.sh
5-2.sh
5-3.sh
5-4.sh
在某些特殊情况下,for循环的条件列表可以完全省略,称为不带列表的for循环语句。此时,Shell将从命令行获取条件列表,请看示例代码
- #!/bin/bash
- for arg
- do
- echo "$arg"
- done
我们输出参数a b c,结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-5.sh a b c
a
b
c
与使用$*做当条件参数的结果一致。
在Linux上,C/C++是最主流的开发语言,为了适应这部分用户的习惯,bash shell也提供了类C风格的for循环,语法如下:
- for ((expression1;expression2;expression3))
- do
- statement1
- ...
- done
举例说明
- #!/bin/bash
- for ((i=1;i<5;++i))
- do
- echo "$i"
- done
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-6.sh
1
2
3
4
语法如下:
- for var in ${array[*]}
- do
- statement1
- ...
- done
其中array表示数组的名称,请看示例:
- #!/bin/bash
-
- alist=(Mon Tue Med)
- for day in ${alist[*]}
- do
- echo "$day"
- done
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-7.sh
Mon
Tue
Med
until语句的语法是:
- until expression
- do
- statement1
- ...
- done
其中当expression为真返回0时,跳出循环体。
while语句的语法与until差不多:
- while expression
- do
- statement1
- ...
- done
差别在于, while语句是当expression条件为假返回非0时,跳出循环体。与until正好相反
Shell语句里提供了break和continue用于控制循环。
break就是跳出循环,continue是跳过当前循环体中continue后面的语句,重新从循环语句开始的位置执行。这里有C语言经验的都了解就不多讲了。补充一点,Shell的break和continue后面可以加数字参数,语法如下:
- break n
- continue n
break n表示跳出n层循环,continue n表示跳过n层循环,举例感受下:
- #!/bin/bash
-
- for i in {1..6}
- do
- for j in {1..6}
- do
- if [ &j -eq 3 ]
- then
- break 2
- fi
-
- echo "$i $j"
- done
- done
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-8.sh
1 1
1 2
本篇主要讲了Shell的循环结构,包括for,until,while,以及控制循环语句break和continue的用法