一、1.1shell函数
1)将命令序列按格式写在一起
2)可方便重复使用命令序列
shell函数定义
[function] 函数名(){
命令序列
[return x] ###使用return或exit可以显式地结束函数
}
函数名
案例
开头定义个函数名f1,函数序列功能式打印”this is liup niubi kls“,结尾函数名用来调用函数
案例2
图中结尾只调用了一个函数,当脚本在运行时只会调用第一个函数序列里的命令
makelocalrepo
uselocalrepo
加上用来调用其他两个函数
因此:函数定义完之后并不会自动执行,需要调用才行,好处在于可以写一段功能代码作为函数,有需要就直接调用
函数运行方式自上而下依次运行
1.2函数返回值
return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255,超出时值将为取余256
例
444 % 256
案例:求和
案例:返还乘积
1.3函数的传参
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n的形式来获取参数的值
例:通过位置变量进行求和
1.4函数的作用范围
函数在shell脚本中仅在当前shell环境中有效
shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
示例:
函数内部变量通过local来实现
通过定义myfun函数,在其内部设置局部变量i
函数内部和外部分别赋值,进行结果验证
定义变量的方式1)定义的变量都是从上往下,里面有local后变量就固定在里面(此为局部)
2)注释local变量就是全局,设置的变量就是全体(人员)
在脚本里定义的变量或者在函数体没有声明为本地变量的都为全局变量,意思是在当前shell环境都识别
如果需要这个变量只在函数中使用则可以在函数中用local关键字声明,这样即使函数体外有个重名的变量也没关系,不影响在函数体的使用
如果是用source执行脚本的话就能看出差别
1.5函数的参数
参数的用法
函数名称 参数1 参数2 参数3 ....
参数的表示方法
$1$2$3......${10}${11}......
案例:阶乘
echo输出的结果在函数里不在for循环里输出的结果只有720
0
当echo输出的结果在for循环里输出的结果会包含720 ,但也会显示多余的数(过程)
案例:
(40是因为我为创建此文件 80是我用touch创建了一个同名文件)
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\]==>一段不显示字串的结束
将途中注释换掉打印将不带颜色
案例:阶乘 递归计算(输入5)
结果的输出步骤
二、数组
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数组的定义方式四种
方法一:
直接把要加入的数组放入括号里,中间用空格隔开
$nu显示数组0位上的字符,加上#后显示该字符的长度
方法二
方法二的是精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续
方法三
#显示数组长度【】里的*表示全部数组的@表示一个意思
当#去掉是【】里的2表示数组里2号位置对应的字符(因数组排序从0开始)
方法四
定义数组可以是不连贯的,!可看见定义数组的下标索引
2.4元素切片和替换
第一次切片:{2:3}从2对应下标索引开始 ,显示3个
第二层切片:{2:4}从2对应的下标索引开始,显示4个
.....
/3/55 :表示3对应的下标索引替换成55
/8/55 :表示8对应下标索引替换成55
2.5数组的删除和追加
根据数组的下标索引对应数字来删除55
直接删除整个数组
方法一追加变量:
数组名[下标]=变量
方法二追加变量:
数组名[${数组名[@]}]=变量名
方法三追加变量:
数组名+=(变量1 变量2 ...)
2.6冒泡排序
冒泡原理:
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