Shell脚本之数组

113 阅读3分钟

数组

什么是数组

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

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

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

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

定义数组的方法

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

数组包括的数据类型:

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

方法一:

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

方法二:

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

方法三:

列表名="value0 value1 value2 value3 ...... "

数组名=($列表名)

方法四:

数组名[0]="value1"

数组名[1]="value2"

数组名[2]="value3"

引用数组的值

1.获取数组所有元素的值

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

例:

[root@localhost opt]# array=(1 2 3 4 5)
[root@localhost opt]# echo ${array[@]}
1 2 3 4 5
[root@localhost opt]# echo ${array[*]}
1 2 3 4 5
[root@localhost opt]# echo $array
1

image.png

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

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

例:

[root@localhost opt]# echo ${array[@]}
1 2 3 4 5
[root@localhost opt]# echo ${array[0]}  //查看数组内第一个元素值
1
[root@localhost opt]# echo ${array[1]}  //查看数组内第二个元素值
2
[root@localhost opt]# echo ${array[4]}  //查看数组内第五个元素值
5

3.获取数组的长度

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

例:

[root@localhost opt]# echo ${array[@]}
1 2 3 4 5
[root@localhost opt]# echo ${array[*]}
1 2 3 4 5
[root@localhost opt]# echo ${#array[@]}     //获取数组的长度
5
[root@localhost opt]# echo ${#array[*]}     //获取数组的长度
5

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

方法一:

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

例:

[root@localhost opt]# echo ${array[*]}
1 2 3 4 5
[root@localhost opt]# echo ${array[-1]}  //查看最后一个元素值
5 
[root@localhost opt]# echo ${array[-2]}  //查看倒数第二个元素值
4

方法二:

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

例:

[root@localhost opt]# length=${#array[@]}   //获取数组的长度
[root@localhost opt]# last=$[$length-1]     //数组的长度减一
[root@localhost opt]# echo ${array[$last]}  //查看最后一个元素值
5

数组的常用操作

数组截取

格式:

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

例:

[root@localhost opt]# arr1=(10 20 30 40 50 60)
[root@localhost opt]# echo ${arr1[@]}
10 20 30 40 50 60
[root@localhost opt]# echo ${arr1[@]:0:3}
10 20 30
[root@localhost opt]# echo ${arr1[@]:2:2}
30 40
[root@localhost opt]# echo ${arr1[@]:2:4}
30 40 50 60

image.png

数组元素替换

1.临时替换

格式:

 echo ${数组名[@]/旧字符/新字符}  

例:

[root@localhost opt]# echo ${arr2[@]}
10 20 30 40 50
[root@localhost opt]# echo ${arr2[@]/20/70}    //将20替换为70
10 70 30 40 50
[root@localhost opt]# echo ${arr2[@]}
10 20 30 40 50

image.png

2.永久替换

选项:

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

例:

[root@localhost opt]# echo ${arr2[@]}
10 20 30 40 50
[root@localhost opt]# arr2=(${arr2[@]/20/666})
[root@localhost opt]# echo ${arr2[@]}
10 20 666 40 50

删除数组

删除数组内的某个元素

格式:

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

例:

[root@localhost opt]# echo ${arr2[@]}
10 20 30 40 50
[root@localhost opt]# unset arr2[2]
[root@localhost opt]# echo ${arr2[@]}
10 20 40 50

删除整个数组

格式:

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

例:

[root@localhost opt]# echo ${arr2[@]}
10 20 30 40 
[root@localhost opt]# unset arr2[@]   //删除整个数组
[root@localhost opt]# echo ${arr2[@]}
                                      //数组为空
[root@localhost opt]# echo ${arr3[*]}
a b c
[root@localhost opt]# unset arr3[*]   //删除整个数组
[root@localhost opt]# echo ${arr3[*]}
                                      //数组为空
[root@localhost opt]#

查看所有数组

命令:

declare -a
[root@localhost opt]# declare -a
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -a BASH_LINENO='()'
declare -a BASH_SOURCE='()'
declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -a DIRSTACK='()'
declare -a FUNCNAME='()'
declare -a GROUPS='()'
declare -a PIPESTATUS='([0]="0")'
declare -a arr1='([0]="10" [1]="20" [2]="30" [3]="40" [4]="50" [5]="60")'
declare -a arr2='([0]="10" [1]="20" [2]="30" [3]="40" [4]="50")'

image.png

将数组的值传给函数

操作步骤

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

例:

[root@localhost opt]# cat fun01.sh

 #!/bin/bash
  
 fun01 () {
    echo "函数接收到的参数为:$@"
    newarr=($@)
    echo "新数组的值为:${newarr[@]}"
 }
  
 arr=(1 2 3 4 5)
 echo "原数组的值为:${arr[@]}"
 #把数组转换成列表作为函数的参数使用
 fun01 ${arr[@]}