一、1.1shell函数

1)将命令序列按格式写在一起

2)可方便重复使用命令序列

shell函数定义

[function] 函数名(){
命令序列
[return x] ###使用return或exit可以显式地结束函数
}
函数名

案例

shell脚本之函数和数组_函数定义

开头定义个函数名f1,函数序列功能式打印”this is liup niubi kls“,结尾函数名用来调用函数

shell脚本之函数和数组_调用函数_02

案例2

shell脚本之函数和数组_显式_03

图中结尾只调用了一个函数,当脚本在运行时只会调用第一个函数序列里的命令

makelocalrepo

uselocalrepo

加上用来调用其他两个函数

因此:函数定义完之后并不会自动执行,需要调用才行,好处在于可以写一段功能代码作为函数,有需要就直接调用

函数运行方式自上而下依次运行

shell脚本之函数和数组_调用函数_04

1.2函数返回值

return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255,超出时值将为取余256

444 % 256

案例:求和

shell脚本之函数和数组_函数定义_05

shell脚本之函数和数组_调用函数_06

案例:返还乘积

shell脚本之函数和数组_调用函数_07

shell脚本之函数和数组_函数定义_08

1.3函数的传参

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n的形式来获取参数的值

例:通过位置变量进行求和

shell脚本之函数和数组_调用函数_09

shell脚本之函数和数组_调用函数_10

1.4函数的作用范围

函数在shell脚本中仅在当前shell环境中有效

shell脚本中变量默认全局有效

将变量限定在函数内部使用local命令

示例:

函数内部变量通过local来实现

通过定义myfun函数,在其内部设置局部变量i

函数内部和外部分别赋值,进行结果验证

定义变量的方式1)定义的变量都是从上往下,里面有local后变量就固定在里面(此为局部)

shell脚本之函数和数组_显式_11

2)注释local变量就是全局,设置的变量就是全体(人员)

shell脚本之函数和数组_显式_12

shell脚本之函数和数组_显式_13

在脚本里定义的变量或者在函数体没有声明为本地变量的都为全局变量,意思是在当前shell环境都识别

如果需要这个变量只在函数中使用则可以在函数中用local关键字声明,这样即使函数体外有个重名的变量也没关系,不影响在函数体的使用

如果是用source执行脚本的话就能看出差别

1.5函数的参数

参数的用法

函数名称 参数1 参数2 参数3 ....

参数的表示方法

$1$2$3......${10}${11}......

案例:阶乘

echo输出的结果在函数里不在for循环里输出的结果只有720

shell脚本之函数和数组_显式_14

0

当echo输出的结果在for循环里输出的结果会包含720 ,但也会显示多余的数(过程)

shell脚本之函数和数组_显式_15

shell脚本之函数和数组_函数定义_16

案例:

(40是因为我为创建此文件 80是我用touch创建了一个同名文件)

shell脚本之函数和数组_函数定义_17

shell脚本之函数和数组_函数定义_18

1.6递归函数

调用自己本身的函数

递归的遍历目录:定义递归函数list——files来实现

盲盒小惊喜

给命令行提示字符加颜色

PS1=")[Ne [1; 34m\] [Nu@\h \W]II$)[Ne [Om\]

PS1="\[Ye [1;35m\] [)[Ne[1;34m\]\u\[\e[1;36m\]@\[\e[1;34m\]\h

\[\e [1; 31m\]\w)[Ve[1;35m\]]\[Ne [1;36m\]1I$)[Ve[om\]"

\[\e[1;35m\][====>定义左边的"["

\[\e[1;34m\]\u ====>定义用户名

\[\e [1; 36m\] @ ==定义"@"

\[\e[1;34m\]\h ====>定义第一个点(.)之前的主机名

\[\e[1;31m] \w ====>定义目录完整路径

\[\e [1; 35m]] =--=>定义"]"

\[\le[1;36m\]\\$ ====>定义"#"或"$"e

\[\e[Om\]==>一段不显示字串的结束 

shell脚本之函数和数组_调用函数_19

shell脚本之函数和数组_调用函数_20

将途中注释换掉打印将不带颜色

shell脚本之函数和数组_显式_21

shell脚本之函数和数组_调用函数_22

案例:阶乘 递归计算(输入5)


shell脚本之函数和数组_调用函数_23

结果的输出步骤

shell脚本之函数和数组_调用函数_24

shell脚本之函数和数组_函数定义_25

二、数组

2.1Shell 数组的定义

1)在 Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔。由此,定义数组的一般形式为:

 array_name=(ele1 ele2 ele3 ... elen) 

注意,赋值号=两边不能有空格,必须紧挨着数组名和数组元素。

2)格式

数组名称:array_name —— 数据元素:ele1 ele2 ele3空格分开 —— 数据长度:3 ——数组下标:长度3每个数据元素下面都跟着下标索引,从0开始,0对应ele1、1对应ele2依次类推

3)bash Shell只支持一维数组,数组从0开始标号,以array[x]表示数组元素,所以array[0]表示array数组的第一个元素

2.2数组的分类

普通数组:不需要声明直接定义,下标索引只能是整数

关联数组:需要用declare -A 声明否则系统不识别,索引可以是字符串

2.3数组的定义方式四种

方法一:

直接把要加入的数组放入括号里,中间用空格隔开

shell脚本之函数和数组_函数定义_26

$nu显示数组0位上的字符,加上#后显示该字符的长度

方法二

shell脚本之函数和数组_显式_27

方法二的是精确的给每一个下标索引定义一个值​加入数组,索引数字可以不连续

方法三

shell脚本之函数和数组_调用函数_28

#显示数组长度【】里的*表示全部数组的@表示一个意思

当#去掉是【】里的2表示数组里2号位置对应的字符(因数组排序从0开始)

方法四

shell脚本之函数和数组_调用函数_29

定义数组可以是不连贯的,!可看见定义数组的下标索引

shell脚本之函数和数组_显式_30

2.4元素切片和替换

shell脚本之函数和数组_函数定义_31

第一次切片:{2:3}从2对应下标索引开始 ,显示3个

第二层切片:{2:4}从2对应的下标索引开始,显示4个

.....

shell脚本之函数和数组_调用函数_32

/3/55 :表示3对应的下标索引替换成55

/8/55 :表示8对应下标索引替换成55

2.5数组的删除和追加

shell脚本之函数和数组_调用函数_33

根据数组的下标索引对应数字来删除55

shell脚本之函数和数组_调用函数_34

直接删除整个数组

shell脚本之函数和数组_调用函数_35

方法一追加变量:

数组名[下标]=变量

shell脚本之函数和数组_显式_36

方法二追加变量:

数组名[${数组名[@]}]=变量名

shell脚本之函数和数组_函数定义_37

方法三追加变量:

数组名+=(变量1 变量2 ...)

2.6冒泡排序

shell脚本之函数和数组_调用函数_38

shell脚本之函数和数组_显式_39

冒泡原理:

array=(90 70 33 49 20 45)
第一轮
90 70 33 49 20 45 第一次对比 数组长度-1 第一轮比较往后,最大值90
70 90 33 49 20 45 第二次对比
70 33 90 49 20 45 第三次对比
70 33 49 90 20 45 第四次对比
70 33 49 20 90 45 第五次对比
70 33 49 20 45 90
第二轮
70 33 49 20 45 90 第一次对比 数组长度-1 第二轮比较往后,最大值70
33 70 49 20 45 90 第二次对比
33 49 70 20 45 90 第三次对比
33 49 20 70 45 90 第四次对比
33 49 20 45 70 90
第三轮
33 49 20 45 70 90 第一次对比 数组长度-1 第三轮比较往后,最大值49
33 20 49 45 70 90 第二次对比
20 33 49 45 70 90 第三次对比
20 33 45 49 70 90
第四轮
20 33 45 49 70 90 第一次对比 数组长度-1 第四轮比较往后,最大值45
20 33 45 49 70 90 第一次对比
20 33 45 49 70 90 第二次对比
20 33 45 49 70 90
第五轮
20 33 45 49 70 90 第一次对比 数组长度-1 第五轮比较往后,最大值33
20 33 45 49 70 90