目录
一、shell函数定义
- 将命令序列按格式写在一起
- 可方便重复使用命令序列
二、函数基本格式
[function] 函数名(){
命令序列
[return x] #使用return或exit可以显示的结束函数
}
或者
#也可以省略掉[function],它表示该函数的功能
函数名() { #函数名后面()是没有内容的
命令序列 #我们执行的命令内容放在{}里面
}
函数定义完之后并不会自动执行,需要调用才行
好处在于可以写一段功能代码作为函数,有需要就直接调用定义的时候哪怕出现语法错误也没关系,不调用就不会报错
当然我们写函数最终目的还是为了调用,为了实现某个功能块。
三、函数返回值
return表示退出函数并返回一个退出值,脚本中可以用$? 变量显示该值使用原则
- 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
- 退出状态码必须是0~255,超出时值将为256取余
四、函数应用示例
1.函数调用
遇到重名时只执行最后一个
一起执行
2.调用函数安装本地yum源
3、函数的作用范围
在Shell 脚本中函数的执行并不会开启一个新的子Shell,而是仅在当前定义的Shell 环境中有效。如果Shell脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的。在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令local 来实现。函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响
函数内部使用local 命令设置变量a,其作用是将变量a限定在函数内部。函数外部同样定义了变量a,内部变量a和全局变量a互不影响。脚本执行时先调用了函数,函数内部变量a为5,所以输出结果是1。调用完函数之后,给变量a赋值为2,再打印外部变量a,所以又输出2.
4. 函数的参数
参数的用法
函数名称 参数1 参数2 参数3...
参数的表示方法
$1 $2 $3 ......${10} ${11}......
1.调用函数时传入两个参数
2.用户输入两个参数
5. 函数的递归
Shell 也可以实现递归函数,就是可以调用自己本身的函数。在Linux系统上编写Shell 脚本的时候,经常需要递归遍历系统的木,列出目录下的文件和河路,逐层递归列出,并对这些层级关系进行展示。
函数递归实现阶乘计算
列出目录内文件列表,目录用蓝色表示,文件显示层级关系
五、shell数组
1.定义数组
可以在单行中使用数值列表来定义一个数组
array_var=(test1 test2 test3 test4)
#这些值将会存储在以0为起始索引的连续位置上
或者
#将数组定义为一组“索引—值”
array_var[0]="test1"
array_var[1]="test2"
array_var[2]="test3"
array_var[3]="test4"
精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续
num=([0]=55 [1]=66 [2]=77 [4]=88)
数组名=([0]=value [1]=value [2]=value. . .)
先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组
list="11 12 13 14"
num=($list)
2.获取数组长度
${#a}显示字符串长度
以列表形式打印出数组中的所有值
在数组中,@和*的效果一样
数组元素的遍历
3.元素切片
4.元素替换
5.元素删除
6.冒泡排序
数组排序算法:冒泡排序
类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。
基本思想:
冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。
算法思路:
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。
score=(77 13 91 56 88)
两两对比,第1个和第2个比,小的值到前面,大的值到后面。
以此类推。第2个和第3个比,第3个和第4个比,第4个和第5个比
------------第一轮------------
77 13 91 56 88 第一次对比 数组长度-1 第一轮比较往后值, 最大值为91
13 77 91 56 88 第二次对比
13 77 91 56 88 第三次对比
13 77 56 91 88 第四次对比
13 77 56 88 91
------------第二轮------------
13 77 56 88 91 第一次对比 数组长度-1第二轮比较往后,第二大的数字88
13 77 56 88 91 第二次对比
13 56 77 88 91 第三次对比
13 56 77 88 91
------------第三轮-----------
13 56 77 88 91 第一次对比 数组长度-1第三轮比较往后,第三大的数字77
13 56 77 88 91 第二次对比
13 56 77 88 91
------------第四轮-----------
13 56 77 88 91 第一次对比 数组长度-1第四轮比较往后,第四大的数字56
13 56 77 88 91