文章目录
锄禾日当午 函数和数组
一、函数
1、函数的定义方式
函数的定义方式有两种
1)规范的函数定义方式
例如
2)常用的函数定义方式
例如
函数定义完成后并不会自动执行,需要调用(脚本中使用函数名调用函数)才行。这样可以将一段常用的功能代码作为函数,有需要时直接调用。例如可以将常用的关闭防火墙、禁止开机自启、关闭核心防护定义为含数执行命令模块。
2、函数的返回值
return表示退出函数ing返回一个退出值,脚本种可以用$?变量显示该值。使用时需要注意以下两点:
-
函数已结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码。
-
退出状态码取值范围为0~255,超出取值时,将对定义的值取余256。
函数返回值的使用可以使得当就脚本运行出现异常时,及时定位有问题的模块,方便调试纠错。例如:
3、函数的调用
直接在脚本中定义函数的代码块后写函数名即可完成调用。但是函数名必须是唯一的,如果先定义了一个函数名,再定义一个同名的函数,在这之后调用的话,只有第二个函数会被调用执行,第一个函数将被覆盖。例如:
函数名不同时互不影响:
函数名相同时,只会调用执行后面函数中的命令模块:
此外,函数的调用必须是函数定义之后,否者无法实现调用。
4、函数的作用范围
在shell脚本中函数的执行并不会开启一个新的子shell,而是仅在当前定义的shell环境中有效,如果shell脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的。
在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令local来实现,函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响。
例如,定义函数内局域变量A和函数外变量A,调用执行脚本结果能够同时输出同名变量的值。
5、函数的参数
函数中可以定义位置变量来实现求和。
6、函数的递归调用
函数可以调用函数本身
执行调用结果
二、数组
1、数组分类
普通数组:不需要申明直接定义,下标索引只能是整数。
关联数组:需要用declare -A 申明,否则系统不识别,索引可以是字符串。
2、数组的定义
常用的几种数组定义方式有
1)直接定义
直接指定赋予各个元素的值,例如
2)赋元素值定义
定义每个索引下标对应的元素的值,例如
或者
3)引用变量定义
将数组的所有元素的值赋给一个变量,再引用此变量定义数组,例如
3、数组的长度和元素、索引下标
获取数组长度的命令为"echo ${#arr[*]}";获取数组所有元素的值”echo ${arr[ *]};获取数组中指定元素的值“echo ${arr[下标索引号]}。例如:
索引下标的值是从0起始,到元素个数-1。
4、遍历输出数组元素的值(for循环)
5、数组元素的切片
6、数组的替换
1)临时替换
将数组的每个元素中,第一个指定字符串”2“替换”7“,例如:
以上均为临时替换,原数组的元素值没有变化
2)重新指定元素值替换(永久替换,生成了新的数组)
7、数组删除
删除整个数组命令为”unset 数组名"
删除数组中指定元素通过指定索引下标删除,如”unset ${数组名[索引下标]}''会删除指定索引下标对应的元素值:
8、数组的应用–冒泡排序
冒泡排序指通过类似气泡上涌的形式,将数组的元素值从大到小或者从小到大排序生成新的数组。
冒泡排序通过循环比较相邻两个元素之间数值大小,通过交替赋值的方式保证较小的元素值始终对应较小的下标索引,从而达到从小到大排序的目的。
冒泡排序通过外部循环定义排序的轮次数,内部循环来比较数组内相邻元素的最大值并将其赋值给最大的索引下标对应的元素。
例如(从小到大排序):
三、小结
-
函数是可以实现对应需求的功能模块,在需要时调用执行。可以使用local定义局部变量,可以使用位置参参数实现传参,并且函数可以调用本身实现递归调用。
-
数组的元素替换有临时替换和永久替换两种。数组冒泡排序的思想是通过对比相邻元素值大小关系,并将较大值的位置后移从而实现排序的目的。