目录
数组的运用
一、shell数组的定义
- 数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组)
- 数组元素的下标由 0 开始。
- Shell 数组用括号来表示,元素用"空格"符号分割开
- 在shell语句中,使用、遍历数组的时候,数组格式要写成 ${arr[@]} 或 ${arr[*]}
二、定义属组的方法
- 方法一:
数组名=(value1 value2 ... valuen) [root@txp data]#a=(1 2 3 4 5) [root@txp data]#echo ${a[@]} 1 2 3 4 5
- 方法二:
数组名=([0]=value0 [1]=value0 [2]=value0 ...) [root@txp otp]#b=([0]=1 [1]=2 [2]=3 [3]=4 [4]=5) [root@txp otp]#echo ${b[@]} 1 2 3 4 5
- 方法三:
数组名[0]="value" 数组名[1]="value" 数组名[2]="value [root@txp data]#c[0]=1 [root@txp data]#c[1]=2 [root@txp data]#c[3]=3 [root@txp data]#c[4]=4 [root@txp data]#echo ${c[@]} 1 2 3 4
三、数组的数据类型
1.数值类型
2.字符类型:使用" "或’ '定义
#数组可以是数值型 [root@txp ~]#a=(1 2 3 4 5);echo ${a[@]} 1 2 3 4 5 #数组可以是混合型 [root@txp ~]#a=(a 1 2 apple);echo ${a[@]} a 1 2 apple
四、数组的基本用法
1.获取数组列表
echo ${数组名[*]} echo ${数组名[@]}
2.获取数组长度
echo ${#数组名[*]} echo ${#数组名[@]}
3.读取某下标赋值
数组名=(元素0 元素1 元素2 ……) ## 定义数组 echo ${数组名[索引值]} ## 输出数组索引值对应的元素,索引值为从0开始
五、数组的常用操作
1.数组的遍历
#!/bin/bash a=(1 2 3 4 5 6) for i in ${a[@]} do echo $i done
2.数组切片
a=(0 1 2 3 4 5 6 7 8) echo "输出整个数组: " ${a[@]} echo "取出数组1到3: " ${a[@]:1:3} echo "取出数组5到后面所有的元素: " ${a[@]:5:5}
3.数组替换
1.临时替换
#临时替换 [root@txp data]#echo ${a[@]/4/6} #重新赋值,可以永久修改 [root@txp data]#a=(${a[@]/4/7})
2.永久替换[root@localhost data]# a=(1 2 3 4 5) [root@localhost data]# a=${a[@]/1/66} [root@localhost data]# a=($a) [root@localhost data]# echo ${a[@]} 66 2 3 4 5
4.数组删除和指定下标的值删除
格式: unset 数组名[数组下标]
[root@localhost data]# echo ${a[@]} 1 2 3 4 [root@localhost data]# unset a[2] [root@localhost data]# echo ${a[@]} 1 2 4 [root@localhost data]#
5.数组追加元素
方法1:
直接使用下标进行元素的追加数组名[下标]=变量
方法2:
将数组的长度作为下标进行追加元素数组名[${数组名[@]}]=变量名
方法3:
使用+=进行追加
批量添加数组名+=(变量1 变量2 ...)
6.查看所有数组—declare -a
六、向函数传数组参数
#!/bin/bash test (){ newarr=($@) echo $1 $2 $3 $4 $5 echo "新的数组值为:${newarr[*]}" } arr=(8 1 22 31 7) echo "原始数组的值为:${arr[*]}" test ${arr[*]}
七、冒泡排序
- 类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。
- 基本思想:
冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。 - 算法思路:
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。 #!/bin/bash #写个冒泡排序算法的函数,通过函数可以对任何乱序的数组进行排序 myarr() { newnum=($@) ## 将外面的数组传进函数 length=${#newnum[@]} ## 数组的长度 ##使用冒泡排序 for ((i=1; i<$length; i++)) ##定义比较的轮数:数组长度减1,从1开始 do ## 比较相邻元素,较大的值往右移 for ((j=0; j<$length-i; j++)) do ## 定义左边元素的值 left=${newnum[$j]} ## 定义右边元素的值 k=$[$j + 1 ] right=${newnum[$k]} ##比较左右两边元素的值,如果左边大于右边,两个元素互换位置 if [ $left -gt $right ];then temp=$left newnum[$j]=$right newnum[$k]=$temp fi done done echo "排序后数组各元素的顺序为:${newnum[@]}" } ################### main ###################### read -p "请定义一个数组的值,每个值用空格分开:" num echo "原数组排序前各元素顺序为:${num[@]}" myarr ${num[@]}