shell中的循环结构

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

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章