Shell脚本的数组

132 阅读2分钟

image.png


数组

数组中可以存放多个值,shell中定义数组时不需要定义数组大小。

数组与字符串的区别
image.png

  • 字符串就是一系列字符的组合
  • 数组每个元素的分隔符一定是空格,而字符串不一定

数组的下标
数组元素的下标由 0 开始。
image.png

数组定义方法

方法一

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

image.png

定义字符串数组时,要用引号括起来。

数组包括的数据类型

  • 数值类型
  • 字符类型,用" "和' '定义

方法二

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

image.png

此方法定义数组,可以跨下标赋值。

方式三

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

image.png

方式四

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

image.png

此方式也可以跨下标赋值,不必按顺序赋值。

数组元素的查看及修改

数组元素的查看

#查看数组中所有元素
${数组名[*]}echo ${数组名[@]}

image.png

如果echo后直接跟数组名,只会输出其中第一个元素。 image.png

#查看数组中某一个元素,指定下标位置上的值
${数组名[下标]}

image.png

获取数组长度

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

image.png

修改数组中的元素

数组名[下标]=value

image.png

补充

  • 默认值替换,如果i有值,输出i;如果i为空值,则会输出:-后的值 image.png

  • 判断是否包含空元素,判断数组长度减一下标是否为最后一个值 image.png image.png

数组遍历

array1=(10 20 30 40 50)
for i in ${array1[*]}
do
  echo $i
done
#将数组中的元素一次输出

image.png image.png

实操:遍历数组中值求总和

image.png image.png

数组切片(截取)

${数组名[@或*]:起始位置下标:长度}

image.png

数组替换

${数组名[@或*]/查找字符/替换字符}

该方式并不会替换数组原有内容。 image.png

想实现永久替换,将临时替换的赋给该数组名。 image.png

注意:数组的替换是字符的替换,包含相同字符的都会被替换 image.png

数组删除

#删除数组
unset 数组名[@或*]
#删除某个元素
unset 数组名[下标]

unset可以删除变量,也可删除某个数组,也可删除数组某个元素。 image.png image.png

数组追加元素

方式一

数组名[下标]="value"

image.png

方式二

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

该用法仅限于没有空元素的数组中 image.png

如果有空的元素,该方法只会修改其中一个元素。 image.png

方式三

数组名=("数组名[@]"  value1  value2  ... )

image.png

双引号不能省略,否则,当数组中存在包含空格的元素时会按空格将元素拆分成多个image.png

不能将“@”替换为“*”,如果替换为“*”,不加双引号时与“@”的表现一致,加双引号时,会将数组中的所有元素作为一个元素添加到数组中。 image.png

方式四

数组名+={value1  value2  ...}

image.png

补充:字符串的添加

字符串通过+=也可实现添加的效果 image.png

但如果添加了let,就会变成整数运算 image.png

向函数传数组参数

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

需要先把获取的参数列表再定义成一个数组。 image.png

实操:将所有元素翻倍并输出

image.png image.png