目录
一、shell函数
1、函数的基本格式
2、函数的返回值return
3、函数的调用
①调用例子
②相同函数名的调用及两个函数里的变量调用
③函数调用顺序
4、函数的作用范围
5、函数的参数
①调用函数时传入2个参数
②用户输入2个参数
6、函数的递归调用
①使用递归计算阶乘
② 用for计算阶乘
7、函数库
二、shell的数组
1、数组的分类
2、数组的定义
①直接把要加入数组的元素用小括号括起来,中间用空格分开
②精确的给每一个下表索引定义一个值加入数组,索引数字可以不连续
③先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组
④根据下表定义
3、数组的长度和元素
①数组中所有元素及总数(长度)
②根据下标获取数组元素的内容
4、数组的遍历
5、数组元素的切片(提取)
6、数组元素的临时替换
7、数组的删除
三、冒泡排序
四、总结
[function] 函数名() {
命令序列
[return x] #使用return或exit可以显示的结束函数
}
或者
#也可以省略掉[function],它表示该函数的功能
函数名() { #函数名后面()是没有内容的
命令序列 #我们执行的命令内容放在{}里面
}
函数定义完之后并不会自动执行,需要调用才行,好处在于可以写一段功能代码作为函数,有需要就直接调用。定义的时候哪怕出现语法错误也没关系,不调用就不会报错,当然我们写函数最终目的还是为了调用,为了实现某个功能块。
表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
函数一结束就取返回值,因为$?变量值返回执行的最后一条命令的退出状态码
退出状态码必须0~255,超出时值将为取余256(例如:返回码为300,那么将300%256)
直接在脚本里定义函数的代码块写函数名即可完成调用
函数名必须是唯一的,如果先定义了一个,再用同样的名称定义第二个,那么第二个会覆盖第一个的功能,所以这里一定要注意不要重名
2个函数里同一个变量的值不一样,第二个变量值会覆盖第一个值
调用函数之前,必须先进行定义!就是说函数的调用必须在函数的后面
在 Shell 脚本中函数的执行并不会开启一个新的子 shell,而是仅在当前定义的 shell 环境中有效。如果Shell脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的。在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令local来实现。函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响。
shell脚本中变量默认全局有效
local命令:将变量限定在函数内部使用
函数内与函数外定义相同变量
hanshu2函数内部使用了local命令设置变量a,其作用是将变量a限定在函数内部,hanshu2函数外部同样定义了变量a,内部变量a和全局变量互不影响。脚本执行先调用了函数hanshu2,函数内部变量a为7,所以输出7,调完函数,变量a赋值为10,所以有输出10
在shell中,调用函数时可以向其传递参数,在函数体内部,通过$n的形式来获取参数值,例如,$1表示第一个参数,$2表示第二个参数,就是使用位置参数来实现参数传递。
简单的来说,就是在编辑一个脚本,其中定义多个函数,在通过其他脚本来使用。
数组是Shell的⼀种特殊变量,是⼀组数据的集合,⾥⾯的每个数据被称为⼀个数组元素。
当前Bash仅支持一维索引数组和关联数组,Bash对数组的大小没有限制。数组中可以存放多个值。初始化时不需要定义数组大小(与 PHP 类似)。与大部分编程语言类似,数组元素的下标由 0 开始。Shell 数组用括号来表示,元素用"空格"符号分割开。
普通数组:不需要声明直接定义,下标索引只能是整数
关联数组:需要用declare -A声明否则系统不识别,索引可以是字符串
数组包括的数据类型: 数值类型 字符类型: 使用“ ” 或 ‘ ’ 定义
格式: 数组名=(value0 value1 value2)
例如:num=(10 20 30 40)
格式:数组名=([0]=value [1]=value [2]=value...)
例如:num=([0]=10 [1]=20 [2]=30 [3]=40)
格式: 变量= "value0 value1 value2 value3"
数组=($列表名)
例如:
list= "10 20 30 40"
num=($list)
格式: 数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
例如: num[0]="10" num[1]="20" num[2]="30"
定义数组最简单的办法就是:a=(10 20 30 40)
读取数组中的全部长度使用:echo ${#a[*/@]}
读取数组中的下标对应的元素长度: echo ${#a[下标]}
读取数组中的全部内容使用:echo ${a[*/@]}
读取数组中的下标对应的元素内容: echo ${a[下标]}
数组长度可以通过 数组名[*] "或" 数组名[@]" 来 获取。
根据下标获取数组中单个元素的长度
使用for循环。遍历输出数组中的每一个元素
${a[*]:n:m} 提取从索引下标n开始的m个元素
${a[*]:n} 提取从索引下标n开始的所有元素
${!a[*]} 查看数组有哪些下标
${a[*]/n/m} 将a数组中的元素中有n字符串的替换为m字符串,如果一个元素有多个n字符串只替换一次
a=(45 10 100 1000 20 30)
unset a //删除数组
a=(45 10 100 1000 20 30)
unset a[3] //删除数组a第3个元素
类似气泡上涌的动作,会将数据的数组从小到大或者从大到小不断的向前移动
基本思想
冒泡排序的基本思想就是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。
算法思路
冒泡算法有双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少
函数
函数的作用: 就是实现一个功能块,然后进行调用,函数名不能重复
函数中可以使用return进行返回一个状态码 ,可以根据状态码查看函数的运行效果
函数中定义变量,可以使用local关键字进行定义成局部变量 ,局部变量只能在函数中使用,不会与shell环境中的其它相同变量名冲突
函数的参数可以使用位置参数进行传参 ,在调用时可以直接输入位置参数的值。也可以调用时再定义位置变量,然后通过获取用户输入的值来传给函数中的变量。
数组
数组的定义方式有多种, 最常见的就是函数名=(元素1 元素2 元素3)
查看数组的长度: ${#数组名[*或@]},查看函数的元素内容: ${数组名[*或@]}
数组中元素的赋值,最常用的赋值为: 数组名[下标]=元素值
数组的切片:切片的意思就是将数组元素内容按照设定的内容进行输出
格式:echo ${数组名[*]:下标:需要打印的几个元素值}
echo ${a[0]}
例如:将数组内容的第二个元素开始的3个元素输出
echo ${num[*]:1:3}
数组的替换:只是在输出的时候进行替换 (注意:在替换的时候,它找到内容是数组元素中的内容)
格式:echo ${a[*]/匹配的内容/替换后的内容} (仅替换每个元素的第一个匹配项)
例如:将输入中的内容3换成10
echo ${num[*]/3/10}