问:给出一个数组array=(8 5 3 2 1 6 7),将数组内的元素进行升序排序,然后生成一个新的数组输出。
经典冒泡排序法
分析:将数组内的这串数字进行从小到大的排序,这里用到一个冒泡的思想,每一轮两两进行对比,把较大的数往后传,一轮下来,最大的数放在末尾,然后进行第二轮,除了最后一位,进行两两比对,把最大的往后换,最后得出来的就是整体第二大的,7个数字一共进行6轮比较,每轮内比较的次数随轮数递减。
代码如下:
#!/bin/bash
array=(8 5 3 2 1 6 7) //数组
echo "原数据为${array[*]}"
for ((i=1; i<${#array[*]}; i++)) //总共比较的轮数,数组长度-1
do
for ((j=0; j<${#array[*]}-i; j++)) //每一轮两两比对的次数,随比较的轮数减少
do
if [ ${array[$j]} -gt ${array[$[$j+1]]} ];then //如果前面的数比后面的数大,就把前面的数换到后面
t=${array[$j]} //先把前面的数赋值给参数t
array[$j]=${array[$[$j+1]]} //然后把后面的数赋值给前面
array[$[$j+1]]=$t //在把t重新赋值给后面,完成交换
fi
done
done
echo "排序后为${array[*]}" //输出新的数组
结果:
数组基础
数组的定义
共有以下四种定义
1.数组名=(value0 value1 value2…)
[root@host ~]# A=(1 2 3 4 5) //数组定义
[root@host ~]# echo ${A[@]} //输出整个数组
1 2 3 4 5
2.数组名=([0]=value [1]=value [2]=value=[3]…)
[root@host ~]# B=([0]=1 [1]=2 [2]=3)
[root@host ~]# echo ${B[@]}
1 2 3
3.列表名=“value0 value1 value2…”
数组名=($列表名)
[root@host ~]# list="1 2 3 4"
[root@host ~]# C=($list)
[root@host ~]# echo ${C[@]}
1 2 3 4
4.数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
…
[root@host ~]# D[0]="1"
[root@host ~]# D[1]="2"
[root@host ~]# D[2]="3"
[root@host ~]# echo ${D[@]}
1 2 3
数组的使用方法
获取数组长度
@和*在这里使用是一样的,表示全部
[root@host ~]# A_length=${#A[@]}
[root@host ~]# echo $A_length
5
[root@host ~]# A_length=${#A[*]}
[root@host ~]# echo $A_length
5
读取某下标赋值
[root@host ~]# echo ${A[@]}
1 2 3 4 5
[root@host ~]# echo ${A[0]}
1
[root@host ~]# echo ${A[1]}
2
[root@host ~]# echo ${A[2]}
3
[root@host ~]# echo ${A[3]}
4
[root@host ~]# echo ${A[4]}
5
数组遍历
使用for循环,将数组元素一个个输出
[root@host ~]# vim A.sh
#!/bin/bash
A=(1 2 3 4 5)
for v in ${A[@]}
do
echo $v
done
[root@host ~]# ./A.sh
1
2
3
4
5
数组切片
数组切片后,返回的是以空格为间隔的字符串
[root@host ~]# echo ${A[@]}
1 2 3 4 5
[root@host ~]# echo ${A[@]:0:2} //:起始位置:长度
1 2
[root@host ~]# echo ${A[@]:2:3}
3 4 5
数组替换
[root@host ~]# echo ${A[@]}
1 2 3 4 5
[root@host ~]# echo ${A[@]/3/666} // /查找字符/替换字符
1 2 666 4 5
[root@host ~]# echo ${A[@]} //直接输出不会替换原数组
1 2 3 4 5
[root@host ~]# A=(${A[@]/3/666}) //要重新赋值
[root@host ~]# echo ${A[@]} //数组才会变
1 2 666 4 5
数组删除
[root@host ~]# echo ${A[@]}
1 2 666 4 5
[root@host ~]# unset A[2] //删除第几个数组元素,从0开始,[2]就是第三个
[root@host ~]# echo ${A[@]}
1 2 4 5
[root@host ~]# unset A //删除整个数组
[root@host ~]# echo ${A[@]}