2021-06-09
关键字:
1、for循环
shell中的for循环有三种类型:
1、带列表的;
2、不带列表的;
3、C语言风格的;
不管哪种类型的for循环,其功能都是根据循环条件重复执行循环体中的语句。
带列表的for循环
列表是指一个已知的有限数量的整数或字符串型数组。
此循环的语法如下所示:
for var in {list} do statement1 statement2 statementn done
循环开始后,list列表中的数据会按从左至右的顺序依次赋给 var 变量,直至所有元素走完则循环停止。
如果列表内容是整数,则必须在数组两侧加上大括号。而如果列表内容为字符串,则可以省略两侧的大括号。
列表字段除了明确指定内容外还可以使用“通配符”表示。通配符为一个星号 ‘*‘ ,其表示当前目录下的所有文件名称,与命令 ‘ls *‘ 等价。
几种常见的带列表的for循环写法如下所示:
for var in 1 2 3 4 5 do done #现场创造一个 1 ~ 8 的连续整数数组出来。 for var in {1...8} do done #创建一个1~10的整数数组,但是前进步长为3。 #实际上只有1 4 7 10会被赋给var变量 for var in {1..10..3} do done #与第一个例子等效 for var in a b c d e do done #与上一个例子等效 for var in $(ls) do done
不带列表的for循环
事实上,不存在可以不带列表数据的for循环,这里所说的不带列表其实只是隐藏了列表而已。
若在编写for循环时不明确指明列表数据,则shell默认会使用参数列表作为数据列表源。
#!/bin/bash for var do echo "var:$var" done
将此源码储存为sh文件,并以以下命令运行:
./loop_test.sh p1 p2 p3
则可以看到如下结果:
var:p1
var:p2
var:p3
C语言风格的for循环
这个纯粹是为了照顾C/C++程序员而设计的写法。其语法格式如下:
for (( 表达式1; 表达式2; 表达式3 )) do 语句1 语句n done
括号内的三个表达式与C语言中的一致,就不再赘述了。具体的实例如下:
#!/bin/bash for (( i=1; i<5; i++ )) do echo "i=$i" done
运行结果如下:
i=1 i=2 i=3 i=4
使用for循环处理数组的示例代码如下所示:
#!/bin/bash array=(mon tue wed thu fri sat sun) for var in ${array[*]} do echo $day done
2、while循环
while循环的语法结构如下所示:
#!/bin/bash while 表达式 do 语句1 语句2 语句n done
当表达式的值为真(即返回值为0时)时执行循环体中的代码。
以下为一个示例程序:
#!/bin/bash i=1 while test $i -lt 10 do echo "i=$i" let i++ done echo echo j=9 while [ $j -gt 4 ] do echo "j=$j" let j-- done
执行结果如下所示:
i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9 j=9 j=8 j=7 j=6 j=5
3、until循环
until循环可以简单理解成就是 while 循环的“非”态。其语法格式如下所示:
#!/bin/bash until 表达式 do 语句1 语句2 语句n done
当表达式的值为假(即返回值为非0时)时执行循环体中的语句。
因其与while是“相对”的关系,因此就不再举例了。
4、循环跳出语句
与传统编程语言类似,shell也提供了 break 和 continue 两个语句用于强行从循环中跳出。
这两个语句的基本用法与含义与其它编程语言一致,就不再解释及举例了。
但是shell中的break和continue又有一点与其它语言不同:它们都允许在语句后加一个数字以表示需要跳出多少层循环(主要用于有循环嵌套的场景)。
当 break 语句后加一个数字时,表示直接跳出指定数字层数的循环,若数字值大于实际嵌套层数,则跳到最外层即停止。
当 continue 语句后加一个数字时,表示直接跳出指定数字层数的循环去执行下一周期的循环体代码。若数字值大于实际嵌套层数,则跳到最外层即停止。
以下给出示例代码:
#!/bin/bash for (( i=1; i<4; i++ )) do for (( j=9; j>6; j-- )) do echo "i*j=$((i*j))" if [ $j -lt 9 ] then continue 20 fi done echo if test $i -gt 2 then break fi done