#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 位置为空