目录
数组的运用
一、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[@]} 









