国际访客建议访问 Primers 编程伙伴 国际版站点 > Bash 教程 > 数组 以获得更好的体验。

# Bash 的数组

数组(Array)是在计算机编程中,用于存储一系列连续数据的集合。每个元素通过一个唯一的数值索引进行访问,Bash 数组的索引从零开始。

Bash 中定义数组的语法为:

数组变量名=(值1 值2 值3 ... 值n)
  • 使用括号包裹

  • 通过空白字符(空格、换行等)分隔

例如:

NAMES=(Tom Jerry Spike)

SCORES=(
    90
    80
    65
)

DEVICES=( /dev/* )  # 使用通配符获取文件列表

# 读取单个数组元素

读取数组元素的语法为:

${数组变量名[索引]}
  • 索引从零开始。

示例:

NAMES=(Tom Jerry Spike)

# 读取数组元素
echo ${NAMES[0]}
echo ${NAMES[1]}
echo ${NAMES[2]}

运行结果:

Tom
Jerry
Spike

# 读取全部元素

直接通过 $数组变量名 读取数组时,实际上读取的是索引为 0 的元素。

如果要读取数组的所有元素,则需要使用 @* 作为索引。

例如:

NAMES=("Hakurei Reimu" "Kirisame Marisa")

# $NAMES 等价于 ${NAMES[0]}
echo '$NAMES:' $NAMES

# 读取所有元素
echo  '${NAMES[@]}:' "${NAMES[@]}"

# for...in 循环遍历数组
for name in "${NAMES[@]}"
do
    echo loop: $name
done

运行结果:

$NAMES: Hakurei Reimu
${NAMES[@]}: Hakurei Reimu Kirisame Marisa
loop: Hakurei Reimu
loop: Kirisame Marisa

注意在 for...in 循环遍历数组时需要使用双引号("${NAMES[@]}"),否则含有空白字符的单个元素会被拆分为多个。

例如:

NAMES=("Hakurei Reimu" "Kirisame Marisa")

# for...in 循环遍历数组时使用双引号
for name in "${NAMES[@]}"
do
    echo loop1: $name
done

# for...in 循环遍历数组时不使用双引号
for name in ${NAMES[@]}
do
    echo loop2: $name
done

运行结果:

loop1: Hakurei Reimu
loop1: Kirisame Marisa
loop2: Hakurei
loop2: Reimu
loop2: Kirisame
loop2: Marisa

# 获取数组的长度

使用 # 可以获取数组长度。

语法为:

${#数组变量名[@]}

# 或

${#数组变量名[*]}

例如:

NAMES=(Tom Jerry Spike)

echo ${#NAMES[@]}

运行结果:

3

# 追加数组元素

使用 += 运算符,可以向数组的末尾追加元素。

语法为:

数组变量名+=(值1 值2 ... 值n)

示例:

NAMES=(Tom Jerry Spike)

NAMES+=(Suika Marisa)

echo ${NAMES[@]}

运行结果:

Tom Jerry Spike Suika Marisa

# 修改数组元素

修改数组元素的语法为:

数组变量名[索引]=
  • 索引从零开始。

示例:

NAMES=(Tom Jerry Spike)

# 修改数组元素
NAMES[0]=Suika
NAMES[1]=Marisa

# 添加元素
NAMES[5]=Fred

# 读取数组长度
echo ${#NAMES[@]}

# 读取所有元素
echo ${NAMES[@]}

运行结果:

4
Suika Marisa Spike Fred

示例中修改了索引为 0 和 1 的元素的值,然后添加了索引为 5 的元素。

Bash 的数组可以是稀疏数组(索引不连续),索引 3 和 4 被跳过了。

# 获取有效索引列表

因为 Bash 的数组可以是稀疏数组(索引不连续),所以遍历索引时不能简单的从 0 到 N - 1。

使用 ! 可以获取有效的索引列表。

语法为:

${!数组变量名[@]}

# 或

${!数组变量名[*]}

示例:

NAMES[0]=Tom
NAMES[3]=Jerry
NAMES[12]=Spike

echo ${!NAMES[@]}

运行结果:

0 3 12

# 删除数组元素

删除数组的一个元素,可以使用 unset 命令。

例如:

NAMES=(Tom Jerry Spike)

unset NAMES[1]

echo ${NAMES[@]}
echo ${#NAMES[@]}
echo ${!NAMES[@]}

运行结果:

Tom Spike
2
0 2
  • 索引为 1 的元素被删除后,数组长度为 2,有效索引列表为 0 2,索引 1 位置为空

本文 更新于: 2025-11-27 09:38:13 创建于: 2025-11-27 09:38:13