shell脚本-数组

295 阅读2分钟

前言

结合生产需求将具有某些共同特性的数据组织为一个集合便于遍历、查询管理,数组实旨为变量的集合,数组(Array)是若干数据的集合,其中的每一份数据都称为元素(Element)。
获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;当然,下标必须大于等于 0。
数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。 这些有序排列的同类数据元素的集合称为数组。

数组定义

在 Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔。
数组包括的数据类型:
数字类型
字符类型(有的元素中有空格为了避免当成两个元素需要加单引号或双引号)

数组(3020104050)
下标01234

方法一:
数组名=(value1 value2 value3 value4 ...)

方法二:
先定义列表,再引用列表的值定义数组
列表名=“value1 value2 value3 value4 value5”
数组名=($列表名)
方法三:
通过下标值来定义每个元素
数组=([0]=value1 [1]=value2 [2]=value3 [3]=value4)

方法四:
通过下标值,一个一个定义数组内的每个元素,也可以用这种方式来修改元素的值
数组名[0]=value1
数组名[1]=value2
数组名[2]=value3
数组名[3]=value4

Snipaste_2022-09-11_20-55-48.png

引用数组的值

获取数组的所有元素的值

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

Snipaste_2022-09-11_20-59-37.png

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

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

Snipaste_2022-09-11_21-06-56.png

获取数组的长度

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

Snipaste_2022-09-11_21-14-13.png

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

方法一:

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

Snipaste_2022-09-11_21-17-25.png

方法二:

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

Snipaste_2022-09-11_21-36-14.png

数组常用操作

数组截取

${数组名[@]:起始长度:截取长度}

Snipaste_2022-09-11_21-41-20.png

数组元素替换

  • 临时替换

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

Snipaste_2022-09-11_21-46-38.png

  • 永久替换

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

Snipaste_2022-09-11_21-49-39.png

删除数组

  • 删除数组内某个元素

unset 数组名[n] //n为下标值

Snipaste_2022-09-11_21-52-50.png

  • 删除整个数组

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

Snipaste_2022-09-11_21-53-55.png

增加数组内的元素

方法一
数组名[n]=元素值
方法二
数组名+=(元素1 元素2 .....)
方法三
数组名[数组长度]=元素值 //数组必须完整,如果某个下标被跳过,会替换掉原来的元素
方法四
数组名=("${数组名[@]}" 元素1 元素2 .....) //引用数值组需加双引号,否则如果数组内有空格会被当成两个元素。 $@表示将所有参数当作每个个体,$*将所有参数当作一个整体

Snipaste_2022-09-11_22-41-35.png

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

通过数组内所有元素遍历 Snipaste_2022-09-11_23-12-41.png

通过下标值遍历 Snipaste_2022-09-11_23-15-25.png

查看所有数组

命令declare -a Snipaste_2022-09-11_23-17-09.png

将数组的值传给函数

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

实例:

Snipaste_2022-09-11_23-36-51.png

示例:使用for循环,使所有元素翻倍

Snipaste_2022-09-11_23-28-43.png

示例:通过函数求所有数组中的元素的累加和
把原数组的所有元素传入函数变成新数组后,再求累加和

Snipaste_2022-09-11_23-25-15.png