数组

概述

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)