目录
一、循环语句
1、for循环
使用
for
循环语句时,需要指定一个变量及可能的取值列表,针对每一个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。
for 循环语句的语法结构如下:for 变量名 in 取值列表do命令序列done遍历for 变量名 in {list}do命令序列done
括号 {} 和 seq 在 for 循环的应用
for i in {1..50..2} #1-50的奇数
for i in {2..50..2} #1-50的偶数
for i in {10..1} #1-10倒序排列
for i in $(seq 10) #1-10正序排列
for i in $(seq 10 -1 1) #1-10倒叙排列
for i in $(seq 1 2 10) #1-10的奇数,中间为步长
for i in $(seq 0 2 10) #1-10的偶数,中间为步长
for语句的操作对象为用户指定名称的变量,并通过in关键字为该变量预先设置了一个取值列表,多个取值之间以空格进行分割。位于do…done之间的命令序列称为循环体,其中的执行语句需要引用变量以完成响应的任务
循环语句的流程
- 首先将列表中的第1个取值赋给变量,并执行 do···done 循环体中的命令序列
- 然后将列表中的第2个取值赋给变量,并执行循环体中的命令序列……
- 以此类推,直到列表中的所有取值用完,最后将跳至 done 语句,表示结束循环
for循环示例:
根据IP地址列表查看主机状态
①编辑ip地址列表
②编写脚本
③执行脚本
幸运会员
①编写列表
②编写脚本
③执行结果
数字炸弹
①编写脚本
②执行结果
2、while循环语句
for
循环语句非常适用于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用另一种循环
—
while
语句。
- 使用 while循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。但是在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行。
- 循环体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束循环。
while 循环语句的语法结构如下所示:while 表达式 #while 后面跟布尔值判断,判断为真,执行判断操作。do命令序列done
执行流程:
- 首先判断 while 后的条件测试操作结果,如果条件成立,则执行 do···done 循环体中的命令序列
- 返回 while 后再次判断条件测试结果,如果条件仍然成立,则继续执行循环体
- 再次返回到 while 后,判断条件测试结果…如此循环
- 直到 while 后的条件测试结果不再成立为止,最后跳转到 done 语句,表示结束循环
while循环示例:
列出100以内所有能被三整除的数:
①编写脚本
②执行
数字炸弹
①编写脚本
②执行结果
监控本机内存和硬盘剩余空间,剩余内存小于512M、根分区剩余空间小于1024M时,发送报警信息
①编写脚本
②执行结果
3、until循环语句
until
循环与
while
循环类似,
while
循环能实现的脚本
until
同样也可以实现,但区别是
while
循环在条件为真是继续执行循环,而
until
则是在条件为假时执行循环。
语法结构如下所示:until 条件测试操作do命令序列done
until 语句的执行流程:
- 首先判断until后的条件测试操作结果,如果条件不成立,则执行do…done循环体中的命令序列
- 返回 until 后再次判断条件测试结果,如果条件仍然不 成立,则继续执行循环体
- 再次返回到until后,判断条件测试结果……如此循环,直到until后的条件测试结果成立为止
- 最后跳转到 done 语句,表示结束循环
until循环示例
计算1~50的和
①编写脚本
②执行结果
4、嵌套循环
嵌套循环示例:
画一个直角三角形
①编写脚本
②执行结果
二、函数
1、函数的用法
Shell
函数可用于存放一系列的指令。在
Shell
脚本执行的过程中,函数被置于内存中,每次调用函数时不需要从硬盘读取,因此运行的速度比较快。在
Shell
编程中函数并非是必
须的元素,但使用函数可以对程序进行更好的组织。将一些相对独立的代码变成函数,可以
提高程序可读性与重用性,避免编写大量重复代码。
function 函数名(){
命令序列
return x #使用return或exit可以显示的结束函数
}
或者
#也可以省略掉[function],它表示该函数的功能
函数名() { #函数名后面()是没有内容的
命令序列 #我们执行的命令内容放在{}里面
}
- 函数定义完之后并不会自动执行,需要调用才行
- 好处在于可以写一段功能代码作为函数,有需要就直接调用定义的时候哪怕出现语法错误也没关系,不调用就不会报错
- 当然我们写函数最终目的还是为了调用,为了实现某个功能块。
2、函数返回值
return表示退出函数并返回一个退出值,脚本中可以用$? 变量显示该值使用原则
- 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
- 退出状态码必须是0~255,超出时值将为256取余
3、函数示例
4、函数的作用范围
- 函数在Shell脚本中仅在当前Shell环境中有效
- Shell脚本中变量默认全局有效
- 将变量限定在函数内部使用local命令
local一般用于局部变量声明,多在在函数内部使用。
- shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止。
- shell函数定义的变量默认是global的,其作用域从“函数被调用时执行变量定义的地方”开始,到shell结束或被显示删除处为止。函数定义的变量可以被显示定义成local的,其作用域局限于函数内。但请注意,函数的参数是local的。
- 如果同名,Shell函数定义的local变量会屏蔽脚本定义的global变量。
5、函数的参数
5.1传参计算两个数的和
5.2用return返回值
6、递归函数
Shell
也可以实现递归函数,就是可以调用自己本身的函数。在
Linux
系统上编写
Shell
脚本的时候,经常需要递归遍历系统的目录,列出目录下的文件和目录,逐层递归列出,并
对这些层级关系进行展示。
①使用递归计算阶乘
②用for计算阶乘