数组

概述

Array(数组) 也是一种变量,数组中可以存放多个值,每个值都称为该数组的元素。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。

与大部分编程语言类似,数组元素的下标由 0 开始。

Shell 数组用 () 小括号来表示,元素用空白符分割

定义数组的方式:ArrayName=(Value1 ... ValueN)

数组的赋值

#!/bin/bash my_array=(A B "C" D) # 我们也可以使用下标来定义数组: array_name[0]=value0 array_name[1]=value1 array_name[2]=value2

数组的引用

通过数组的下标来获取数组的值,数组中的第一位下标是 0,第二位下标是 2……以此类推

引用数组元素值的一般格式是:${array_name[index]} # index 是下标的数字

实例

#!/bin/bash my_array=(A B "C" D) echo "第一个元素为: ${my_array[0]}" echo "第二个元素为: ${my_array[1]}" echo "第三个元素为: ${my_array[2]}" echo "第四个元素为: ${my_array[3]}" 执行脚本,输出结果如下所示: $ chmod +x test.sh $ ./test.sh 第一个元素为: A 第二个元素为: B 第三个元素为: C 第四个元素为: D

引用数组中指定的元素

参考 变量与系统环境配置详解 中变量的高级技巧一节,可以通过 ${ } 来截取数组中的元素

# 该示例通过 ${VARIABLE:START:LENGTH} 方式,将数组左边起第一个元素开始,向右截取到末尾的所有元素,并 echo 出来。 my_arrays=(a b c d) echo ${my_arrays[@]:1} b c d

引用数组中的所有元素

使用 @* 可以获取数组中的所有元素,例如:

my_arrays=(A B C D) echo "数组的元素为: ${my_arrays[*]}" 数组的元素为: A B C D echo "数组的元素为: ${my_arrays[@]}" 数组的元素为: A B C D

Note:

  • - # 当变量加上 "" 会当成一串字符串处理.
  • @ # 变量加上 "" 依然当做数组处理.
  • 在没有加上 “” 的情况下 效果是等效的.

效果如下:

~]# cat array.sh #!/bin/bash array=("li chen hao" "zhang_na") for i in ${array[@]}; do echo "@符号无双引号:"${i} done echo ------------ for i in "${array[@]}"; do echo "@符号有双引号:"${i} done echo ------------ for i in ${array[*]}; do echo "*符号无双引号:"${i} done echo ------------ for i in "${array[*]}"; do echo "*符号有双引号:"${i} done ~]# bash array.sh @符号无双引号:li @符号无双引号:chen @符号无双引号:hao @符号无双引号:zhang_na ------------ @符号有双引号:li chen hao @符号有双引号:zhang_na ------------ *符号无双引号:li *符号无双引号:chen *符号无双引号:hao *符号无双引号:zhang_na ------------ *符号有双引号:li chen hao zhang_na

获取数组的长度

数组的长度分两种情况,一种是数组元素的个数,另一种事数组元素的所有索引号

my_arrays=(A B C D) echo "数组元素个数为: ${#my_arrays[*]}" 数组元素个数为: 4 echo "数组元素个数为: ${#my_arrays[@]}" 数组元素个数为: 4 echo "数组元素的索引号为: ${!my_arrays[@]}" 数组元素的索引号为: 0 1 2 3

向数组中添加元素

# 在数组末尾添加元素 ~]# abc=(a b c) ~]# echo ${abc[@]} a b c ~]# abc+=(d) ~]# echo ${abc[@]} a b c d # 向指定 index 位置添加元素 ~]# arrays=(a b c d) ~]# arrays[5]=f ~]# echo ${arrays[@]} a b c d f ~]# echo ${!arrays[@]} 0 1 2 3 5

删除数组中的元素

~]# arrays=(a b c d) ~]# echo $arrays a b c d ~]# unset arrays[2] ~]# echo ${arrays[@]} a b d ~]# echo ${!arrays[@]} 0 1 3 ~]# arrays+=(c) ~]# echo ${!arrays[@]} 0 1 3 4 ~]# echo ${arrays[@]} a b d c ~]# arrays[2]=c ~]# echo ${arrays[@]}

Note:

  • 某个元素删除后,其余元素的 index 号不变
  • 如果对删除元素的数组添加新元素,则新元素的 index 号向后递增

数组的应用实例

对数组中的元素排序

# 原始数组:B=(20 9 01 5 11 4 6 14 12 14 0808) b=($(printf '%s\n' "${B[@]}"|sort -n)) # 排序后的数组:b=(01 4 5 6 9 11 12 14 14 20 0808)

数组的遍历,在 for 循环中的应用

#!/bin/bash # b=(01 4 5 06 9 11 12 14 14 20 0808) let max=${#b[@]}-1 for Subscript in `seq 0 ${max}`;do echo ${b[${Subscript}]} done 可以遍历数组并输出数组中每一个值

最后修改 July 5, 2024: shell, docker (876d0a08)