Shell脚本之数组

概念

数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。

组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。

用于区分数组的各个元素的数字编号称为下标。元素的下标从0开始。

数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。 这些有序排列的同类数据元素的集合称为数组。

2 定义数组的方法

定义数组的方法

Shell中,数组用括号来表示,元素用"空格"符号分隔开。

数组包括的数据类型:

  • 数值型
  • 字符型 (如果元素值为字符类型,需要加单引号或双引号,防止单个元素中有空格被当成2个元素)
  • 混合型数值加字符

方法一:

 数组名=(value1  value2 value3 value4 ...)

方法二:

先定义列表,再引用列表的值定义数组。

 列表名="value1  value2 value3 value4 value5"
 数组名=($列表名)

方法三:

用过下标值定义每个元素。

 数组名=([0]=value1  [1]=value2  [2]=value3)

方法四:

通过下标值,一个一个定义数组内的每个元素。

同时也可以通过这种方式修改元素的值。

 数组名[0]=value1
 ​
 数组名[1]=value2
 ​
 数组名[2]=value3
 ​
 数组名[3]=value4

 

 

 

引用数组的值

获取数组的数据列表(所有元素的值)

 echo ${array[@]}
 或
 echo ${array[*]}

 

 

 如果只按普通变量的方式查看,则只会显示数组的第一个元素值

查看数组内某一个元素的值

 ${数组名[n]}       //n代表元素的下标
 ​
 echo ${array[0]}   //获取数组内第一个元素的值(下标为0的元素值)
 echo ${array[1]}   //获取数组内第二个元素的值(下标为1的元素值)

定义数组时如果跳过了下标,则改下标元素值为空

获取数组的长度

 echo ${#数组名[*]}
 echo ${#数组名[@]}

 

 

 

 

查看数组内最后一个元素的值

方法一:

 echo ${array[-1]}    //获取最后一个元素的值
 echo ${array[-2]}    //获取倒数第二个元素的值

方法二:

 length=${#array[@]}    //获取数组的长度
 last=$[$length-1]      //数组的长度减1
 echo ${array[$last]}   //查看最后一个元素值
 #用这种方式查看最后一个元素值,可以判断这个数组的下标是不是完整的。因为如果中间跳过了一个下标,那么此种方法无法获取最后一个元素的值。
 ​
 echo ${array[${#array[@]}]}  //查看下标值为数组长度的元素,

 

 

 

 

如果数组元素是完整的,即下标从0开始,且中间没有跳过某个下标,那么下标为数组长度的元素应该为空

组的常用操作

数组分片(数组截取)

格式:

 ${数组名[@]:起始位置:截取长度}        //起始位置从0算起
 ​
 ${数组名[@]}           //获取整个数组的元素值
 ${数组名[@]:0:3}      //从下标为0的元素开始截取,共截取3个元素。(即截取元素1到元素3)
 ${数组名[@]:2:2}      //从下标为2的元素开始截取,共截取2个元素。(即截取元素3到元素4)

示例:

[root@localhost ~]# arr1=(10 20 30 40 50 60)
[root@localhost ~]# echo ${arr1[@]}
10 20 30 40 50 60
[root@localhost ~]# echo ${arr1[@]:0:3}   //从下标为0的元素开始截取,共截取3个元素
10 20 30
[root@localhost ~]# echo ${arr1[@]:2:2}   //从下标为2的元素开始截取,共截取2个元素
30 40
[root@localhost ~]# echo ${arr1[@]:2:4}   //从下标为2的元素开始截取,共截取4个元素
30 40 50 60

 

 

数组元素替换

临时替换(不会影响原有数组)

 echo ${数组名[@]/旧字符/新字符}    //会替换所有元素中能匹配到的字符,但这是临时替换,不会改变原有数组的值

 


示例1:将30替换为100

[root@localhost ~]# arr2=(10 20 30 40)      //定义数组
[root@localhost ~]# echo ${arr2[@]}         //查看数组内的所有元素
10 20 30 40
[root@localhost ~]# echo ${arr2[@]/30/100}     //将30临时替换为100
10 20 100 40
[root@localhost ~]# echo ${arr2[@]}          //不会改变原有数组内的元素值
10 20 30 40

 

 

示例2:将所有的0替换为7

[root@localhost ~]# echo ${arr2[@]}
10 20 30 40
[root@localhost ~]# echo ${arr2[@]/0/7}     //将所有的0替换为7
17 27 37 47
[root@localhost ~]# echo ${arr2[@]}         //不会改变原有数组的元素值
10 20 30 40

 

 

新赋值(永久替换)

 数组名=(${数组名[@]/旧字符/新字符})

示例:将30重新赋值为200

[root@localhost ~]# echo ${arr2[@]}
10 20 30 40
[root@localhost ~]# arr2=(${arr2[@]/30/200})      //重新赋值
[root@localhost ~]# echo ${arr2[@]}               //会改变原有数组的元素值
10 20 200 40

 

 

删除数组

删除数组内的某个元素

 unset 数组名[n]        //删除数组内的某一个元素,n为下标值

示例:

[root@localhost ~]# echo ${arr2[@]}
10 20 30 40
[root@localhost ~]# unset arr2[2]      //删除下标值为2的元素
[root@localhost ~]# echo ${arr2[@]}    //30已被删除
10 20 40

 

 

删除整个数组.

 unset 数组名[*]
 或
 unset 数组名[@] 

示例:

[root@localhost ~]# echo ${arr2[@]}
10 20 40
[root@localhost ~]# unset arr2[@]
[root@localhost ~]# echo ${arr2[@]}

[root@localhost ~]# 

 

 

数组扩写,增加数组内的元素

当我们原本定义的数组不能满足我们的需求时,我们需要追加数组内的元素。

 #方法1
 数组名[n]=元素值       //使用下标值直接增加元素
 ​
 #方法2
 数组名+=(元素1 元素2 .....)
 ​
 #方法3
 数组名[数组长度]=元素值     //此种方法必须保证数组元素是完整的,如果某个下标被跳过了,此种方法会替换掉原来的某个元素
 ​
 #方法4
 数组名=("${数组名[@]}" 元素1 元素2 .....)
//引用数组值必须加双引号,不然原数组内有空格的单个元素(例如"zhang san")会被当成2个元素。
//且必须使用@,因为加上双引号之后"$@"表示将所有参数当作个体,而$*表示将所有参数当作一个整体。

方法1示例:数组名[n]=元素值

[root@localhost ~]# echo ${array1[@]}
10 20 30 40
[root@localhost ~]# array1[4]=50
[root@localhost ~]# array1[5]=60
[root@localhost ~]# echo ${array1[@]}
10 20 30 40 50 60

 

 

方法2示例:数组名+=(元素值)

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

 

 

方法3示例:数组名[数组长度]=元素值

[root@localhost ~]# echo ${arr1[@]}
10 20 30 40 50 60
[root@localhost ~]# arr1[${#arr1[@]}]=70      //"${#arr1[@]"可以获取数组长度
[root@localhost ~]# echo ${arr1[@]}
10 20 30 40 50 60 70

 

 

方法4示例:数组名=("${数组名[@]}" 元素1 元素2 .....)

[root@localhost ~]# arr=(1 2 3)
[root@localhost ~]# echo ${arr[@]}
1 2 3
[root@localhost ~]# arr=("${arr[@]}" 4 5)               //引用数组的所有元素值一定要使用$@,因为加上双引号之后"$@"表示将所有参数当作个体
[root@localhost ~]# echo ${arr[@]}
1 2 3 4 5
[root@localhost ~]# echo ${#arr[@]}            //数组长度为5
5
[root@localhost ~]# arr=("${arr[*]}" 6)       //如果使用$*,那么数组内的所有元素会被当作一个整体,即被当成一个元素
[root@localhost ~]# echo ${#arr[@]}            //数组长度为2
2
[root@localhost ~]# echo ${arr[@]}
1 2 3 4 5 6

 

 

当元素类型为字符时,一定要加引号,避免单个元素中有空格被当成2个元素

使用for遍历输出数组的每个元素值

通过数组内的所有元素来遍历。

[root@localhost ~]# echo ${arr1[@]}
10 20 30 40 50 60 70
[root@localhost ~]# for i in ${arr1[@]};do echo $i;done
10
20
30
40
50
60
70

 

 

将数组的值传给函数

操作步骤:

 第一步:向函数传入数组的时候需要先把数组转换成列表作为函数的参数使用:
 函数名 ${数组名1[@]}
 ​
 第二步:在函数内把传入的列表重新组合成数组:
 数组名2=($@)
 ​
 第三步:在函数外重新组合成数组:
 数组名3=(`函数名 ${数组名1[@]}`)

示例1:获取数组的数据列表作为函数的参数使用

 #!/bin/bash
  
 fun01 () {
 #不能写$1,否则只会输出数组的第一个元素
    echo "函数接收到的参数为:$@"
 #在函数内把传入的列表重新组合成数组
    newarr=($@)
    echo "新数组的值为:${newarr[@]}"
 }
  
 #### main ####
 arr=(1 2 3 4 5)
 echo "原数组的值为:${arr[@]}"
 #把数组转换成列表作为函数的参数使用
 fun01 ${arr[@]}

 

 

示例2:把数组的所有元素通过函数求出累加和

把原数组的所有元素传入函数变成新数组后,再求出累加和。

 vim shu1.sh
 ​
 #!/bin/bash
 ​
 myfun () {
 ​
    newarr=($@)
    sum=0
    for i in ${newarr[@]}
    do
       sum=$[sum+i]
    done
    echo "数组内所有元素的累加和是:$sum"
 }
 ​
 ##### main ######
 ​
 arr=(3 1 4 2 6 5)
 ​
 myfun ${arr[@]}

 

 


posted @ 2022-10-29 18:20  风夏呀  阅读(964)  评论(0)    收藏  举报