shell脚本中数组的运用
- 一、数组的介绍
- 1、概念
- 2、定义方法
- 3、数组包括的数据类型
- 二、关于数组的操作
- 1、获取数组长度
- 2、获取数组各个元素的下标
- 3、获取数组列表或单个元素
- 4、对数组切片输出
- 5、对数组里的元素替换
- 6、删除单个元素或数组
- 7、数组追加元素
- 8、向函数传入数组的值
- 三、数组排序算法
- 1、冒泡排序
- 基本思想
- 算法思路
- 实现
- 2、直接选择排序
- 基本思想
- 实现
- 3、直接插入排序
- 定义
- 基本思想
- 实现
- 4、反转排序
- 定义
- 基本思想
- 实现
一、数组的介绍
1、概念
数组:数组是存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用。
2、定义方法
方法一):
数组名=(value0 value1 value2 ....)
方法二):
数组名=([0]=value [1]=value [2]=value ...)
方法三):
列表名=“value0 value1 value2 ....”
数组名=($列表名)
方法四):
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
3、数组包括的数据类型
- 数值类型
- 字符类型
字符类型要是应用双引号或单引号定于
二、关于数组的操作
1、获取数组长度
a=(1 2 3 4 5)
b=${#a[*]}
或
b=${#a[@]}
2、获取数组各个元素的下标
echo ${!a[@]}
或
echo ${!a[*]}
3、获取数组列表或单个元素
#获取数组列表
echo ${a[*]}
或
echo ${a[@]}
#获取单个元素
echo
4、对数组切片输出
#将i数组的33 44 55输出
i=(11 22 33 44 55)
echo ${i[@]:1:3}
5、对数组里的元素替换
a=(10 20 30 40 100)
echo ${a[@]/10/60} //此方法替换只是输出时替换,但原数组并没有被替换
#永久替换相当于重新定义数组
b=(1 2 3 4 5)
b=(${b[@]/2/6})
echo ${b[@]}
6、删除单个元素或数组
#删除单个元素
c=(1 2 3 4 5 6)
echo ${!c[@]}
unset c[5]
echo ${c[@]}
#删除数组
unset c
echo ${c[@]}
注意:如果下标为0 1 2 3 4,把3删除了,下标就变成了0 1 2 4,不是0 1 2 3。
7、数组追加元素
方法一)
array_name[index]=value
方法二)
array_name[${#array_name[@]}]=value
方法三)
array_name=("${array_name[@]}" value1 ... valueN)
#双引号不能省略,否则,当数组array_name中存在包含空格的元素时会按空格将元素拆分成多个。不能将"@"替换成“*”,不加双引号时与“@”表现一致,加双引号时,会将数组array_name中所有的元素作为一个元素添加到数组中
方法四)
array_name+=(value1 value2 ... valueN)
待添加元素必须用“()”包围起来,并且多个元素用空格分隔
方法一:
方法二:
方法三:
方法四:
8、向函数传入数组的值
三、数组排序算法
1、冒泡排序
冒泡排序:类似于气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。
基本思想
冒泡排序的基本思想时对比相邻的两个元素值,如果满足条件iu交换元素,把较小的元素移动到数组前面,把大的元素移动到数组的后满(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。
算法思路
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小以确定是否交换位置,对比和交换次数随排序轮数而减少。
实现
2、直接选择排序
基本思想
将指定排序位置与其它数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始排序),这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式。
实现
#!/bin/bash
shuzu=(63 4 24 1 3 15)
length=${#shuzu[@]}
for ((a=1;a<length;a++))
do
i=0
for ((b=1;b<=length-a;b++))
do
if [ ${shuzu[$i]} -lt ${shuzu[$b]} ]
then
i=$b
fi
done
last=$[length - a]
tmp=${shuzu[$last]}
shuzu[$last]=${shuzu[$i]}
shuzu[$i]=$tmp
done
echo "排序后的数组值为:${shuzu[@]}"
3、直接插入排序
定义
插入排序,又叫直接插入排序。实际中,我们玩扑克牌的时候,就用了插入排序的思想
基本思想
在待排序的元素中,假设前n-1元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序,按照此法对所有的元素进行插入,直到整个序列有序。
但是我们并不能确定待安排元素中究竟哪儿一部分是有序的,所以我们一开始只能认为第一个元素是有序的,一次将后的元素插入到这个有序序列中来,直到整个序列有序为止。
实现
#!/bin/bash
arr=(5 2 4 6 1 3)
length=${#arr[@]}
echo "排序前的数组为:${arr[@]}"
for ((a=1;a<length;a++))
do
for ((b=0;b<a;b++))
do
if [ ${arr[$a]} -lt ${arr[$b]} ]
then
tmp=${arr[$a]}
arr[$a]=${arr[$b]}
arr[$b]=$tmp
fi
done
done
echo "排序后的数组为:${arr[@]}"
4、反转排序
定义
反转排序是以相反的顺序把原有数组的内容重新排序
基本思想
把数组最后一个元素和第一个元素替换,倒数第二个元素和第二个元素替换,依此类推,直到把所有数组反转替换。
实现
#!/bin/bash
arr=(1 2 3 4 5)
echo "反转排序前的数组为:${arr[@]}"
length=${#arr[@]}
for ((a=0;a<length/2;a++))
do
tmp=${arr[$a]}
arr[$a]=${arr[$length-1-a]}
arr[$length-1-a]=$tmp
done
echo "反转排序后的数组为:${arr[@]}"