Linux之数组(除了头疼还有啥!)

Linux之数组(除了头疼还有啥!)

一、数组的概念

1.定义数组方法

数组:(30 20 10 60 50 40)

索引值:0 1 2 3 4 5

方法1:

数组名=(value0 value1 value2 …)
例:
[root@localhost ~]#qwe=(7 4 1 8 5 2)
[root@localhost ~]#echo ${qwe[*]}
7 4 1 8 5 2
[root@localhost ~]#echo ${qwe[@]}
7 4 1 8 5 2

方法2:

数组名=([0]=value [1]=value [2]=value …)
例:
[root@localhost ~]#asd=([0]=9 [1]=6 [2]=3)
[root@localhost ~]#echo ${asd[@]}
9 6 3

方法3:

列表名="value0 value1 value2 …"
数组名=($列表名)
例:
[root@localhost ~]#zxc="7 8 9 4 5 6"
[root@localhost ~]#qaz=($zxc)
[root@localhost ~]#echo ${qaz[@]}
7 8 9 4 5 6

方法4:

数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
例:
[root@localhost ~]#wsx[0]=3
[root@localhost ~]#wsx[1]=2
[root@localhost ~]#wsx[2]=1
[root@localhost ~]#echo ${wsx[@]}
3 2 1

2.数组包括的数据类型

1)数值类型

2)字符类型(字符串)

使用" "或’'定义,防止元素当中有空格,元素按空格分割

3.获取数组长度

arr_number=(1 2 3 4 5)
echo ${#arr_number[*]}
或者echo ${#arr_number[@]}
例:
[root@localhost ~]#arr=(9 5 1 7 5 3)
[root@localhost ~]#echo ${#arr[*]}
6
[root@localhost ~]#echo ${#arr[@]}
6

4.读取某个下标赋值

arr=(1 2 3 4 5) 
echo ${arr[索引值]}
例:
[root@localhost ~]#arr=(9 5 1 7 5 3)
[root@localhost ~]#echo ${#arr[@]} #查看数组长度
6
[root@localhost ~]#echo ${arr[0]} #查看索引为0的参数
9
[root@localhost ~]#echo ${arr[1]}
5
[root@localhost ~]#echo ${arr[2]}
1
[root@localhost ~]#echo ${arr[3]}
7

二、数组的处理

1.数组遍历

[root@localhost ~]#vim bianli.sh
[root@localhost ~]#chmod +x bianli.sh 
[root@localhost ~]#./bianli.sh 
1
2
3
4
5
[root@localhost ~]#cat bianli.sh 
#!/bin/bash
arr2=(1 2 3 4 5) #定义数组
for i in ${arr2[*]} #依次输出每个索引所对应的参数
do
  echo $i
done

在这里插入图片描述

2. @ 和 @和 @*的区别

$@和$*的区别
两者没加""是什么区别
加上""
$* 将数组中的数据作为一个整体使用
$@ 将数组中每个参数分别作为单个的个体使用
$# 显示的是参数的数量,也可称为长度

3.数组切片

[root@localhost ~]#cat qiepian.sh 
arr=(1 2 3 4 5 6)
echo ${arr[@]}   #输出整个数组
echo ${arr[@]:0:2} #获取${数组名[@或*]:起始位置:长度}的值
echo ${arr[@]:1:3} #输出起始索引为1的后面的三个参数的值

[root@localhost ~]#./qiepian.sh 
1 2 3 4 5 6
1 2
2 3 4

在这里插入图片描述

4.数组替换

格式:${数组名[*或@]/源参数值/将要替换的参数值}
arr=(1 2 3 24 6)
#临时替换:将数组arr1中的参数值4替换为66,但原来的数组中的参数值并不会改变
echo ${arr[*]/4/66}     
echo ${arr[*]}

#永久替换:可通过重新赋值实现
arr=(${arr[*]/4/66})   
echo ${arr[*]}

例:

在这里插入图片描述

5.数组删除

格式:unset 数组名[索引]     #删除单个
   或unset 数组名          #删除整个数组

例:

在这里插入图片描述

6.数组追加

方法一:通过使用索引在数组最后添加参数。

需要知道数组中有多少参数,以及没有对数组进行任何删减

[root@localhost ~]#arr=(1 2 3 4 5 6)
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6
[root@localhost ~]#arr[6]=7
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6 7

方法二:未进行过任何删减的情况下,最后一个索引值加1也就是要添加的参数对应的索引值

[root@localhost ~]#arr=(1 2 3 4 5 6)
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6
[root@localhost ~]#arr[${#arr[*]}]=7
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6 7

方法三:直接获取源数组的全部元素再加上新要添加的元素,一并重新赋予该数组,重新刷新定义索引,可以避免中间有删减的情况

[root@localhost ~]#arr=(1 2 3 4 5 6)
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6
[root@localhost ~]#arr=("${arr[@]}" 7 8)
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6 7 8

注:双引号不能省略,否则数组中存在包含空格的元素时会按空格将元素拆分成多个 不能将“@”替换为“*”,如果替换为“* ”,不加双引号时与“@”的表现一致,加双引号时,会将数组arr中的所有元素作为一个元素添加到数组中

方法四:使用arr+=(元素 元素 元素)添加

[root@localhost ~]#arr=(1 2 3 4 5 6)
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6
[root@localhost ~]#arr+=(7 8 9)
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6 7 8 9

三、数组传参给函数

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

[root@localhost ~]#vim test1.sh
[root@localhost ~]#cat test1.sh 
#!/bin/bash
test1 () {
   echo "接受到的参数列表:$@"
   abc2=$1                 
   echo "新数组的值为:${abc2[*]}" 
}

abc=(3 2 1 4 5)
echo "原始数组的值为:${abc[*]}"
test1 $abc  
[root@localhost ~]#chmod +x test1.sh 
[root@localhost ~]#./test1.sh 
原始数组的值为:3 2 1 4 5
接受到的参数列表:3
新数组的值为:3

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

[root@localhost ~]#vim test2.sh
[root@localhost ~]#cat test2.sh 
#!/bin/bash
test2 () {
  abc1=($(echo $@))    #也可表示为   abc1=(`echo $@`)

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

abc=(3 2 1 4 5)
echo "原始数组的值为:${abc[*]}"
test2 ${abc[*]} 
[root@localhost ~]#chmod +x test2.sh 
[root@localhost ~]#./test2.sh 
原始数组的值为:3 2 1 4 5
新数组的值为:3 2 1 4 5

3.从函数返回数组

[root@localhost ~]#vim test3.sh
[root@localhost ~]#cat test3.sh
#!/bin/bash
test3 () {
  abc3=(`echo $@`)
  for ((i=0;i<=$[$# - 1];i++))           #$#是原始数组的元素个数,这里是取出新数组的索引值是从0-4
  do
    abc3[$i]=$[${abc3[$i]} * 2]          #这里是将每个原始索引对应的元素值乘以2传到新的数组中对应的索引的元素中去
  done
  echo "${abc3[*]}"                      #输出新的数组
}

abc=(2 3 1 5 4)
test3 ${abc[*]}
[root@localhost ~]#chmod +x test3.sh 
[root@localhost ~]#./test3.sh 
4 6 2 10 8

四、数组排序算法

1.冒泡排序

类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。

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

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

[root@localhost ~]#vim mppx.sh
[root@localhost ~]#cat mppx.sh 
#!/bin/bash
array=(60 20 30 50 10 40) #定义一个数组
echo "原数组参数顺序为:${array[*]}"
for ((i=1;i<${#array[*]};i++)) #定义排序轮次
do
    for ((a=0;a<${#array[*]}-i;a++)) #确定第一个元素的索引位置
    do
      if [ ${array[$a]} -gt ${array[$a+1]} ] #第一个元素和第二个元素比较,如果第一个元素比第二个元素大则互换
      then
        temp=${array[$a]}  #把第一个元素的值保存在临时变量temp中
        array[$a]=${array[$a+1]}  #把第二个元素的值赋给第一个元素
        array[$a+1]=$temp #把原第一个元素的值,赋给第二个元素
      fi
    done
done
    echo "冒泡排序后,数组顺序为:${array[*]}"
[root@localhost ~]#chmod +x mppx.sh 
[root@localhost ~]#./mppx.sh 
原数组参数顺序为:60 20 30 50 10 40
冒泡排序后,数组顺序为:10 20 30 40 50 60

2.直接选择排序

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

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

[root@localhost ~]#vim zjpx.sh
[root@localhost ~]#cat zjpx.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@localhost ~]#chmod +x zjpx.sh 
[root@localhost ~]#./zjpx.sh 
原数组的排列顺序为63 4 24 1 3 15
排序后数组的排列顺序为1 3 4 15 24 63

3.反转排序

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

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

[root@localhost ~]#vim fzpx.sh
[root@localhost ~]#cat fzpx.sh 
#!/bin/bash
array=(60 20 30 50 10 40)
echo "反转前顺序:${array[*]}"  
length=${#array[*]}
for ((i=0;i<$length/2;i++))
do
  temp=${array[$i]}
  array[$i]=${array[$length-1-$i]}
  array[$length-1-$i]=$temp
done
echo "反转排序后:${array[*]}"
[root@localhost ~]#chmod +x fzpx.sh 
[root@localhost ~]#./fzpx.sh 
反转前顺序:60 20 30 50 10 40
反转排序后:40 10 50 30 20 60

猜你喜欢

转载自blog.csdn.net/qq_35456705/article/details/112000218
今日推荐