引言
数组(Array)是若干数据的集合,其中的每一份数据都称为元素(Element)。 Shell 并且没有限制数组的大小,理论上可以存放无限量的数据。和 C++、Java、C# 等类似,Shell 数组元素的下标也是从 0 开始计数。 获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;当然,下标必须大于等于 0。 遗憾的是,常用的 Bash Shell 只支持一维数组,不支持多维数组
1、shell数组的定义
1.1、方法一
用括号( )来表示数组,数组元素之间用空格来分隔:
数组名=(value0 value1 value2 ...)
1.2、方法二
数组名=([0]=value0 [1]=value1 [2]=value2 ...)
1.3、方法三
列表名="value0 value1 value2 ..."
数组名=$(列表名)
1.4、方法四
数组名[0]="value0"
数组名[1]="value1"
数组名[2]="value2"
2、数组的数据类型
2.1、数值类型
num=(11 22 33 44 55)
2.2、字符类型
string=(aa bb cc dd ee) ##使用"" 或 ''定义
3、数组的常用操作
3.1、输出数组所有元素值
${数组名[*]}
${数组名[@]}
##使用`@`或`*`可以获取数组中的所有元素
3.2、获取数组的长度
##所谓数组长度,就是数组元素的个数。
利用`@或*`,可以将数组扩展成列表,然后使用`#`来获取数组元素的个数
${#数组名[*]}
${#数组名[@]}
3.3、判断数组是否完整
${数组名[数组长度]} 如果此值为空,则代表数组完整,因为最后一个元素的下标是 数组长度减一
tips:因为元素下标从0开始,如果一个元素下标是数组长度的话,这个元素是没有值的,但是上图中有值,就说明前面肯定有元素没有赋值,数组长度不是实际值。
3.4、获取数组中单个元素值
${数组名[index]} index代表元素的下标,范围为 0 ~ 数组长度减一
3.5、数组分片 截取
${数组名[@]:起始位置:截取长度} 起始位置是从0算起的
3.6、数组元素值的替换
${数组名[@]/旧字符/新字符} 会替换所有元素上能匹配到的字符,但是这是临时替换不会影响原有数组
可通过重新赋值实现替换原有数组: 数组名=(${数组名[@]/旧字符/新字符} )
3.7、删除数组元素中的值
unset 数组名[index] 删除某一个元素
unset 数组名[*] 删除整个数组值
## 删除某个元素值以后,元素的值为空,但是下标保留,其他元素的下标不变!!
3.8、追加数组
数组名+=(元素1 元素2 ...)
数组名=("${数组名[@]}" 元素1 元素2 ...)
数组名[数组长度]=元素值
数组名[n]=值
4、如何向函数中传入数组参数
向函数传入数组的时候需要先把数组转换成列表作为函数参数使用 函数名 ${数组名1[@]}
在函数内把传入的列表重新组合成数组 数组名2=($@)
函数外重新组合成数组 数组名3=(`函数名 ${数组名1[@]}`)
在数组传入函数之后,我们还可以对数组进行进一步的操作,例如:
5、冒泡排序
5.1、概述
冒泡排序: 类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。
5.2、基本思想
冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就想气泡一样从底部上升到顶部
5.3、算法思路
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减一次,因为最后一次循环只剩下一个数组元素,不需要比较,同时数组已经完成了排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少