一、for循环语句

1、for循环语句的结构

使用 for 循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。在这里"取值列表"称为for 语句的执行条件,其中包括多个属性相同的对象,需要预先指定(如通讯录、IP 黑名单)。for循环语句的语法结构如下所示。

Shell编程之循环语句与函数_数组名

上述语句结构中,for 语句的操作对象为用户指定名称的变量,并通过in 关键字为该变量预先设置了一个取值列表,多个取值之间以空格进行分隔。位于 do...done 之间的命令序列称为循环体,其中的执行语句需要引用变量以完成相应的任务。

for 语句的执行流程:首先将列表中的第一个取值赋给变量,并执行 do...done 循环体中的命令序列;然后将列表中的第二个取值赋给变量,并执行循环体中的命令序列...依此类推,直到列表中的所有取值用完,最后将跳至 done 语句,表示结束循环。

Shell编程之循环语句与函数_数组_02

2、for语句应用示例

例如:根据人事部门给出的员工姓名的拼音列表,在 Linux服务器中添加相应的用户账号,初始密码均设置为“123456”。其中,员工姓名列表中的账号数量并不固定,而且除了要求账号名称是拼音之外,并无其他特殊规律。

Shell编程之循环语句与函数_Shell_03

Shell编程之循环语句与函数_Shell_04

Shell编程之循环语句与函数_数组名_05

若要删除 aaa.sh 脚本所添加的用户,只需参考上述脚本代码中“useradd”改为“userdel”,并把echo一行删除掉,例如:

Shell编程之循环语句与函数_Shell_06

之后保存退出然后执行该脚本即可。

3、根据IP地址列表检查主机状态

根据包含公司各服务器IP 地址的列表文件,检査其中各主机的 ping 连通性,输出各主机是否启动、关闭。其中,服务器的数量并不固定,各服务器的IP 地址之间也无特殊规律。针对此案例要求,可先指定 IP 地址列表文件 ipadds.txt,然后编写一个名为bbb.sh的 Shell 脚本,从 ipadds.txt 文件中读取各服务器的 IP 地址,重复执行 ping 连通性测试并根据测试结果输出相应的提示信息。

Shell编程之循环语句与函数_数组_07

Shell编程之循环语句与函数_Shell_08

Shell编程之循环语句与函数_Shell_09

二、使用while循环语句

1、while语句的结构

使用 while 循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行。因此,循环体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束循环。

while 循环语句的语法结构如下所示。

Shell编程之循环语句与函数_Shell_10

while 语句的执行流程:首先判断 while 后的条件测试操作结果,如果条件成立,则执行 do..done 循环体中的命令序列;返回 while 后再次判断条件测试结果,如果条件仍然成立,则继续执行循环体;再次返回到 while 后,判断条件测试结果..….如此循环,直到 while后的条件测试结果不再成立为止,最后跳转到 done语句,表示结束循环。

Shell编程之循环语句与函数_Shell_11

使用 while 循环语句时,有两个特殊的条件测试操作,即 true(真)和 false(假)。使用 true 作为条件时,表示条件永远成立,循环体内的命令序列将无限执行下去,除非强制终止脚本(或通过 exit 语句退出脚本);反之,若使用false作为条件,则循环体将不会被执行。

2、while语句应用示例

例如,若要添加 20 个用户,名称依次为 name1、s=name2、…、name20,可以参考以下操作。

Shell编程之循环语句与函数_Shell_12

接着运行此脚本,然后查看创建结果:

Shell编程之循环语句与函数_数组_13

如果要删除创建的用户,同样将“useradd”改为“userdel“,然后将echo一行删除,然后运行此脚本:

Shell编程之循环语句与函数_数组_14

3、猜价格游戏案例

案例要求如下:由脚本预先生成一个随机的价格数目(0~999)作为实际价格,判断用户猜测的价格是否高出或低于实际价格,给出相应提示后再次要求用户猜测:一直到用户猜中实际价格为止,输出用户共猜测的次数、实际价格。

针对上述要求,主要设计思路如下:通过环境变量 RANDOM 可获得一个小于 216的随机整数,计算其与 1000 的余数即可获得 0~999的随机价格;反复猜测操作可以通过以 true作为测试条件的 while 循环实现,当用户猜中实际价格时终止循环;判断猜测价格与实际价格的过程采用if语句实现,嵌套在 while 循环体内;使用变量来记录猜测次数。

Shell编程之循环语句与函数_数组名_15

Shell编程之循环语句与函数_Shell_16

三、until循环语句

1、until语句的结构

unti 循环与 while 循环类似,while 循环能实现的脚本 unti 同样也可以实现,但区别是while 循环在条件为真是继续执行循环,而 unti 则是在条件为假时执行循环。

until 循环语句的语法结构如下所示。

Shell编程之循环语句与函数_数组名_17

Shell编程之循环语句与函数_数组名_18

until 语句的执行流程:首先判断unt 后的条件测试操作结果,如果条件不成立,则执于 do...done 循环体中的命令序列;返回 untl 后再次判断条件测试结果,如果条件仍然不成立,则继续执行循环体;再次返回到 unt 后,判断条件测试结果…….如此循环,直到 until后的条件测试结果成立为止,最后跳转到 done语句,表示结束循环。

Shell编程之循环语句与函数_数组_19

2、until语句应用示例

计算从1到50的和,从1开始相加,采用循环的方式,每次循环后加1,将得到的值加入计算的和中,数字运算采用的是let 方式,直到加到 50 为止,具体的操作参考如下。

Shell编程之循环语句与函数_Shell_20

Shell编程之循环语句与函数_数组_21

四、Shell函数

1、函数的用法

Shel 函数可用于存放一系列的指令。在 Shell 脚本执行的过程中,函数被置于内存中每次调用函数时不需要从硬盘读取,因此运行的速度比较快。在 Shel 编程中函数并非是必须的元素,但使用函数可以对程序进行更好的组织。将一些相对独立的代码变成函数,可以提高程序可读性与重用性,避免编写大量重复代码。

Shell 函数定义的方法如下所示:

Shell编程之循环语句与函数_数组名_22

Shell编程之循环语句与函数_数组_23

“function”关键字表示定义一个函数,可以省略;

“{"符号表示函数执行命令的入口,该符号可以与函数名同行也可以在函数名下一行的句首;

"}"符号表示函数体结束,两个大括号之间{}是函数体;

"命令序列”部分可以是任意的 Shel 命令,也可以调用其他函数:

"return"表示退出函数返回一个退出值,通过返回值判断执行是否成功,也可以使用 exit 终止整个 Shell 脚本。

Shell函数调用的方法为:函数名[参数 1][参数 2]。下面通过具体的示例学习函数的定义与调用。

Shell编程之循环语句与函数_Shell_24

Shell编程之循环语句与函数_Shell_25


五、Shell数组

在 Shell 脚本中,数组是一种常见的数据结构,主要的应用场景包括:获取数组长度获取元素长度、遍历元素、元素切片、元素替换、元素删除等等。

数组常用定义方法包括以下几种。

方法一:

数组名=(value0 value1 value2 ..)

方法二:

数组名=([0]=value [1]=value [2]=value ..)

方法三:

列表名=”value0 value1 value2数组名=($列表名)

方法四:

数组名[0]=”value”

数组名[1]=”value”

数组名[2]=”value”

下面通过具体的示例掌握属组的基本使用方法:

Shell编程之循环语句与函数_数组名_26

1、读取某下标赋值

Shell编程之循环语句与函数_Shell_27

2、数组遍历

Shell编程之循环语句与函数_Shell_28

3、数组切片

${数组名[@或”]:起始位置:长度}

Shell编程之循环语句与函数_数组_29

4、数组替换

${数组名[@或*]/查找字符/替换字符},并不会替换数组原有内容

Shell编程之循环语句与函数_数组_30

要想实现改变原有数组,可通过重新赋值实现

Shell编程之循环语句与函数_Shell_31

5、数组删除

删除数组使用”unset“命令

Shell编程之循环语句与函数_数组_32

要想删除第三个元素,如下所示:

Shell编程之循环语句与函数_Shell_33

六、Shell脚本调试

除了 echo 命令之外,bash Shel 也有相应参数可以调试脚本。使用 bash 命令参数调试,命令的语法为:

Shell编程之循环语句与函数_数组名_34

-n:不会执行该脚本,仅查询脚本语法是否有问题,如果没有语法问题就不显示任何内容,如果有问题会提示报错。

-v:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也会给出错误提示。

-x:将执行的脚本内容输出到屏幕上,这个是对调试很有用的参数。

当脚本文件较长时,可以使用 set 命令指定调试一段脚本。

Shell编程之循环语句与函数_数组名_35