数组真的不难!!千万不要给自己错觉......看完你也明白!!!


在这里插入图片描述

一、数组定义方法

方法一

数组名=(value0 value1 value2 ...)

在这里插入图片描述

方法二

数组名=([0]=value [1]=value [2]=value ...)

在这里插入图片描述
方法三

列表名="value0 value1value2 ...."
数组名=($列表名)

在这里插入图片描述
方法四

数组名[0]="value"
数组名[1]="value" 
数组名[2]="value"

在这里插入图片描述

查看数组 echo ${数组名[*]}

二 、数组包括的数据类型

  • 数值类型
  • 字符类型:
    字符类型一定要使用" "或‘ ’定义否则会有空格

三、获取数组长度

[root@192 shuzu]#arr1=(1 2 3 4 5)
[root@192 shuzu]#echo ${#arr1[*]}      #也就是数组中总共多少个元素
5

四、读取某下标赋值

abc=(11 22 33 44 55)
echo ${abc[*]}    #例如echo ${abc[0]}就是获取索引为0的元素,即第一个元素 为11
1

在这里插入图片描述

五、数组切片

arr=(1 2 3 4 5)

echo ${arr[@]}          输出整个数组

echo ${arr[@]:0:2}    获取${数组名[@或*]:起始位置:长度}的值

echo ${arr[@]:2:3}

在这里插入图片描述

六、数组替换

格式:
$(数组名[@或*]/查找字符/替换字符}

arr=(1 2 3 4 5)

echo ${arr[@]/4/66}         $(数组名[@或*]/查找字符/替换字符)

echo ${arr[@]}              不会替换数组原有内容

arr=(${arr[@]/4/66})        要实现改变原有数组,可通过重新赋值实现
 
echo ${arr[@]}              相当于创造了一个新的数组

在这里插入图片描述

七、数组删除

使用unset删除数组

[root@192 ~]#abc=(1 2 3 4 5 65)
[root@192 ~]#unset abc
[root@192 ~]#echo ${abc[*]/3/33}

删除数组中的某个索引对应的元素的值

[root@192 ~]#abc=(1 2 3 4 5 65)
[root@192 ~]#echo ${abc[*]}
1 2 3 4 5 65
[root@192 ~]#unset abc[2]     #删除索引2的对应的元素值
[root@192 ~]#echo ${abc[*]}
1 2 4 5 65

八、追加数组中的元素

要在数组中原有的元素后面再追加一些元素的话,可以使用如下方法实现追加:
方法一:

array_name [index]=value
   数组名    索引号  元素

在这里插入图片描述

方法二、

array_name[${#array_name [@]}]=value

在这里插入图片描述
#当数组的元素非常多的时候,可以直接使用数组的长度作为自己将要追加的索引的值,这样就可以直接追加元素了。
因为原始数组的索引是从0开始的,所以用长度减去1就是原始数组的最后的以为索引值了,那么自己将要添加的值应该是原始索引值的后一位,那显然就等于数组的长度值了。

方法三、
格式: array_name=("${array_name[@]}" value1… valueN)

[root@192 shuzu1]#arr1=(1 2 3 4 5)
[root@192 shuzu1]#echo ${arr1[*]}
1 2 3 4 5
---------------------------------------------------------
[root@192 shuzu1]#arr1=("${arr1[@]}" 6 7)
[root@192 shuzu1]#echo ${arr1[*]}
1 2 3 4 5 6 7

双引号不能省略,否则,当数组arr1中存在包含空格的元素时会按空格将元素拆分成多个。
不能将“@“替换为“ * ”,如果替换为" * “,不加双引号时与”@"的表现一致,加双引号时,会将数组arr1中的所有元素作为一个元素添加到数组中。
可以简单的理解为:用 * 号是作为一个整体,而用@还是单个的个体。

[root@192 shuzu1]#abc=(1 2 3 4 5)
[root@192 shuzu1]#echo ${abc[*]}
1 2 3 4 5
[root@192 shuzu1]#abc=("${abc[@]}" 6 7 8)
[root@192 shuzu1]#echo ${abc[*]}
1 2 3 4 5 6 7 8
[root@192 shuzu1]#for i in ${abc[*]}
> do
> echo $i
> done
1
2
3
4
5
6
7
8
--------------------------------------------------------------------------------
[root@192 shuzu1]#abc1=(1 2 3 4 5)
[root@192 shuzu1]#echo ${abc1[*]}
1 2 3 4 5
[root@192 shuzu1]#abc1=("${abc1[*]}" 6 7 8)
[root@192 shuzu1]#echo ${abc1[*]}
1 2 3 4 5 6 7 8
[root@192 shuzu1]#for i in "${abc1[@]}";do echo $i;done
1 2 3 4 5
6
7
8

方法四、

格式   array_name+=(value1  ... valueN)

在这里插入图片描述

==待添加元素必须用"()"包围起来,并且多个元素用空格分隔 ==

九、向函数传数组参数

1、如果将数组变量作为函数参数,函数只会取数组变量的第一个值。

#!/bin/bash
#这是错误的做法
test1 () {

echo "接收到的参数列表: $@"

newarrary=($1)               ####这边定义一个数组一定要加括号

echo "新数组的值为: ${newarrary[*]}"

}

array=(3 2 1 4 5)

echo "原始数组的值为: $(array[*]}"

test1 $array

解决这个问题则需要将数组变量的值分解成单个的值,然后将这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新的数组变量。

2、解决这个问题则需要将数组变量的值分解成单个的值,然后将这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新的数组变量。
如下:

[root@192~ shuzu1]#vim c.sh
#!/bin/bash
test2 () {
  abc1=($(echo $@))    或者表示为   abc1=(`echo $@`)

  echo "新数组的值为:${abc1[*]}"
}

abc=(3 2 1 4 5)
echo "原始数组的值为:${abc[*]}"
test2 ${abc[*]}                           #将数组的值分解为单个的值
-------------------------------------------------
[root@192~ shuzu1]#chmod +x c.sh 
[root@192~ shuzu1]#./c.sh 
原始数组的值为:3 2 1 4 5
新数组的值为:3 2 1 4 5

10、数组排序方法

(一)、冒泡排序

类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。
在这里插入图片描述

基本思想
冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置) ,这样较小的元素就像气泡一样从底部上升到顶部。

算法思路:

冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。

[root@192 ~]#vim shuzupaixu.sh

#!/bin/bash

abc=(30 50 10 40 60 20)           #定义数组赋予元素

echo "原数组的排列顺序为:${abc[*]}"  #输出现在数组元素顺序

length=${#abc[*]}                #定义原数组长度为length   也可以不定义 只是方便一些

for ((i=1;i<length;i++))         #进入外部循环,比较长度 是 数组长度 减一
do
   for ((a=0;a<$length-i;a++))   #进入内部循环,确定元素的位置,比较相邻的两个索引,较大的往后稍,比较次数为长度减一它是随着轮数减少二减少的  
   do
   first=${abc[$a]}              ##定义第一个元素的值
   b=$[$a+1]                     ##定义第二个元素的索引号
   second=${abc[$b]}             ##定义第二个元素的值

   if [ $first -gt $second ]     #第一个元素和第二个元素比较,如果第一个元素比第二个元素大则互换
     then
        temp=$first              #把第一个元素的值保存在临时变量temp中
        abc[$a]=$second          #把第二个元素的值赋给第一个元素
        abc[$b]=$temp            #把原第一个元素的值,赋给第二个元素
   fi                               完成位置互换
done
done

echo "排序后数组的排序顺序为:${abc[*]}"    #输出排序后数组的排序顺序

在这里插入图片描述

(二)、直接选择排序

与冒泡排序相比,直接选择排序的交换次数更少,所以速度会快些。

基本思想:

将指定排序位置与其它数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始排序) ,这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式。

在这里插入图片描述

[root@gcc shuzu1]#vim d.sh
#!/bin/bash
abc=(63 4 24 1 3 15)    #定义一个数组
echo "原数组的排列顺序为${abc[*]}" 
length=${#abc[*]}    #定义原数组的长度,这里原数组的长度为6

for ((i=1;i<$length;i++))   #这里是定义比较的轮数,比较5次
do
  index=0    #表示从索引0开始比较

  for ((k=1;k<=$length-i;k++))   #这里是确定用于比较的第一个元素的索引范围,比如已经定义了从索引0开始了,所以和0进行比较的范
围就是从索引1-5了
   do
     first=${abc[$k]}   #定义与index相比较的索引的取值为first
    if [ $first -gt ${abc[$index]} ]   #通过将index所在的索引的值与k所在的索引的值进行比较,获取最大元素的索引位置
    then
        index=$k    #通过比较将较大的数定义到index中,进行下一轮的比较
    fi
       last=$[$length-$i]    #获取在比较的范围中的最后一个元素的索引
       temp=${abc[$last]}   #将上一步获取到的最后一个元素的索引的值保存到临时变量temp中
       abc[$last]=${abc[$index]}  #把最大上面for循环比较出来的最大元素的值赋值给最后一个元素
       abc[$index]=$temp    #把原来最后一个元素的值赋给原来最大值的位置的元素
   done
done

echo "排序后数组的排列顺序为${abc[*]}"   #输出排序后的数组
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[root@gcc shuzu1]#chmod +x e.sh 
[root@gcc shuzu1]#./e.sh 
原数组的排列顺序为63 4 24 1 3 15
排序后数组的排列顺序为1 3 4 15 24 63

(三)、反转排序

以相反的顺序把原有数组的内容重新排序。

基本思想:
把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,1以此类推,直到把所有数组元素反转替换。

[root@192~shuzu1]#vim f.sh
#!/bin/bash
abc=(10 20 30 40 50 60)    #定义一个数组
echo "反转前顺序:${abc[*]}"  
length=${#abc[*]}    #定义数组的长度为length

for ((i=0;i<$length/2;i++))   #定义数组的比较的范围,因为是两两进行比较,所以只需要比较length/2组就行
do
  temp=${abc[$i]}   #定义第一个元素为临时变量temp
  abc[$i]=${abc[$length-1-$i]}  #将同组的最后一个元素的值赋值给第一个元素,注意因为我们i是从0开始的,所以最后一个元素的索引号是长度减去1之后再减去变量i的值才是最后一个索引的值
  abc[$length-1-$i]=$temp   #将同组的第一个元素的值赋值给最后一个元素
done

echo "反转排序后:${abc[*]}"
------------------------------------------------------------------------------------------------------
[root@192~shuzu1]#chmod +x f.sh 
[root@192~ shuzu1]#./f.sh 
反转前顺序:10 20 30 40 50 60
反转排序后:60 50 40 30 20 10

猜你喜欢

转载自blog.csdn.net/panrenjun/article/details/111713651