数组
一、数组的定义方法
数组的作用:一次性定义多个变量
方法1
数组名=(value0 valuel value2 …)
- 举例
[root@localhost opt]# arr=(1 2 3 4 5 6) [root@localhost opt]# echo ${arr[*]} 1 2 3 4 5 6
方法2
数组名=( [0]=value [1]=value [2]=value …)
- 举例
[root@localhost opt]# arr=([0]=1 [1]=2 [2]=3) [root@localhost opt]# echo ${arr[*]} 1 2 3
方法3
列表名=“value0 valuel value2 …” 数组名=($列表名)
- 举例
[root@localhost opt]# list="1 2 3 4" [root@localhost opt]# arr2=($list) [root@localhost opt]# echo ${arr2[*]} 1 2 3 4
方法4
数组名[0]=“value” 数组名[1]=“value” 数组名[2]=“value”
- 举例
[root@localhost opt]# arr3[0]="1" [root@localhost opt]# arr3[1]="2" [root@localhost opt]# arr3[2]="3" [root@localhost opt]# echo ${arr3[*]} 1 2 3
二、数组包括的数据类型
- 数值类型:a=( 1 2 3)
- 字符类型:b=( x y z)
使用" "或‘ ’定义
三、获取数组长度
[root@localhost opt]# arr=(1 2 3 4 5 6) [root@localhost opt]# echo ${#arr[*]} #也就是数组中总共多少个元素 6
四、读取下标索引的值
[root@loaclhost opt]# arr1=(1 2 3 4 5) [root@loaclhost opt]# echo ${arr1[0]} #获取索引为0的元素,即第一个元素 1 [root@loaclhost opt]# echo ${arr1[3]} #获取索引为3的元素,即第四个元素 4
**注意:**下标索引从0开始
五、数组遍历
[root@localhost opt]# vim shuzu.sh a=(1 2 3 4 5 6 aa bc def gg) for i in ${a[*]} do echo $i done
六、数组切片
含义:取数组中的某一段的元素的值
格式 ${数组名[@或*]:起始位置(起始索引):长度}
- 示例
[root@localhost opt]# arr1=(1 2 3 4 5) [root@localhost opt]# echo ${arr1[*]} 1 2 3 4 5 [root@localhost opt]# echo ${arr1[*]:0:2} #这里是从0索引开始获得往后两位元素的值 1 2 [root@localhost opt]# echo ${arr1[*]:2:2} #获取从索引2开始往后的两位元素的值 3 4
七、数组替换
格式 ${数组名[@或*]/查找字符/替换字符}
7.1 临时替换
[root@loaclhost opt]# arr1=(1 2 3 4 5) [root@localhost opt]# echo ${arr1[*]} 1 2 3 4 5 [root@loaclhost opt]# echo ${arr1[*]/4/66} #将数组arr1中的元素4替换为66,这只是临时替换,并不是永久替换 1 2 3 66 5 [root@loaclhost opt]# echo ${arr1[*]} #原来的数组中的元素的值并不会改变 1 2 3 4 5
7.2 永久替换
[root@loaclhost opt]# arr1=(${arr1[*]/4/66}) #如果想要永久替换的话,可通过重新赋值实现 [root@loaclhost opt]# echo ${arr1[*]} 1 2 3 66 5
八、删除数组
8.1 使用unset删除数组
[root@loaclhost opt]# arr1=(1 2 3 4 5) [root@localhost opt]# echo ${arr1[*]} 1 2 3 4 5 [root@loaclhost opt]# unset arr1 [root@loaclhost opt]# echo ${arr1[*]}
8.2 删除数组中的某个索引对应的元素的值
[root@loaclhost opt]# arr1=(1 2 3 4 5) [root@loaclhost opt]# echo ${arr1[*]} 1 2 3 4 5 [root@loaclhost opt]# unset arr1[2] #删除索引2的对应的元素值 [root@loaclhost opt]# echo ${arr1[*]} 1 2 4 5
九、追加数组中的元素
方法1
[root@loaclhost opt]# arr1=(1 2 3 4 5) [root@loaclhost opt]# echo ${arr1[*]} 1 2 3 4 5 [root@loaclhost opt]# arr1[5]=6 #此时追加数组索引5对应的元素值为6 [root@loaclhost opt]# echo ${arr1[*]} 1 2 3 4 5 6
方法2
[root@loaclhost opt]# arr1[${#arr1[*]}]=7 #当数组的元素非常多的时候,可以直接使用数组的长度作为自己将要追加的索引的值,这样就可以直接追加元素了 [root@loaclhost opt]# echo ${arr1[*]} 1 2 3 4 5 6 7
方法3
[root@loaclhost opt]# arr1=(1 2 3 4 5) [root@loaclhost opt]# echo ${arr1[*]} 1 2 3 4 5 [root@loaclhost opt]# arr1=("${arr1[@]}" 6 7) [root@loaclhost opt]# echo ${arr1[*]} 1 2 3 4 5 6 7
双引号不能省略,否则,当数组arr1中存在包含空格的元素时会按空格将元素拆分成多个。
不能将“@“替换为“ * ”,如果替换为" * “,不加双引号时与”@"的表现一致,加双引号时,会将数组arr1中的所有元素作为一个元素添加到数组中。
可以简单的理解为:用 * 号是作为一个整体,而用 @ 还是单个的个体。
方法四
[root@loaclhost opt]# arr1=(1 2 3 4 5) [root@loaclhost opt]# echo ${arr1[*]} 1 2 3 4 5 [root@loaclhost opt]# arr1+=(7 8) #待添加元素必须用“()"包围起来,并且多个元素用空格分隔 [root@loaclhost opt]# echo ${arr1[*]} 1 2 3 4 5 7 8
十、数组给函数传参
示例一:获取数组的数据列表作为函数的参数使用
- 法一
[root@localhost opt]# vim shuzu1.sh xyz () { abc1=($(echo $@)) #$@会把每个变量的值单独处理 echo "数组的值:${abc1[*]}" } abc=(`seq 1 10`) xyz ${abc[*]}
- 法二
[root@localhost opt]# vim shuzu1.sh xyz () { abc1=(`echo $@`) echo "数组的值:${abc1[*]}" } abc=(`seq 1 10`) xyz ${abc[*]}
示例2:函数返回数组,求和
[root@localhost opt]# vim shuzu2.sh test () { abc1=(`echo $@`) sum=0 for i in ${abc1[*]} do sum=$(($sum+$i)) done echo "$sum" } abc=(1 2 3 4 5) test ${abc[*]}
示例三:将数组中的每一个数*2
[root@localhost opt]# vim shuzu3.sh test () { abc1=(`echo $@`) for ((i=0;i<=$(($#-1));i++)) do abc1[$i]=$((${abc1[$i]}*2)) done echo "${abc1[*]}" } abc=(1 2 3 4 5 6) test ${abc[*]}
十一、冒泡排序
[root@localhost opt]# vim maopaopaixu.sh abc=(20 10 60 40 70 50) len=${#abc[*]} #获取数组长度 for ((i=1;i<$len;i++)) #最后一位不用比较,所以用< do for ((k=0;k<$len-1;k++)) #索引 do first=${abc[$k]} #取第一个值 j=$(($k+1)) #当先索引号加一 second=${abc[$j]} #取第二个值 if [ $first -gt $second ] #比较大小并交换次序 then temp=$first abc[$k]=$second abc[$j]=$first fi done done echo ${abc[*]}