Shell 数组
在 Shell 编程中,数组是一种非常重要且实用的数据结构,它允许在单个变量中存储多个值。与某些编程语言类似,Shell 数组的索引从 0 开始,并且其长度没有固定限制。
✅ Shell 主要支持两种数组:
- 索引数组 (Indexed Arrays):使用整数作为索引(从
0
开始)。 - 关联数组 (Associative Arrays):使用字符串作为索引(类似于其他语言中的 Map 或 Dictionary)。
需要注意的是,Bash 是 Shell 中最常用的,它对数组的支持最完善。原始的 Bourne Shell (/bin/sh
) 并不支持数组,因此下面的内容主要基于 Bash。
索引数组 (Indexed Arrays)
索引数组是最常见的数组类型,使用整数索引来访问元素。以下索引数组结构图:
1. 创建数组
在 Shell 编程中,有多种方式可以创建索引数组。以下是几种常见的方法:
1. 直接赋值创建:使用赋值语句直接初始化数组,元素放在括号中,用空格分隔。
fruits=("Apple" "Banana" "Orange") # 创建一个包含多个元素的数组
empty_array=() # 创建一个空数组
2. 逐个元素赋值:通过指定索引逐个为数组元素赋值。
fruits[0]="Apple"
fruits[1]="Banana"
fruits[2]="Orange"
# 甚至可以跳过索引,下面的数组长度是 2,但有一个索引是 5
fruits[5]="Mango"
3. 使用 declare 命令:使用declare -a
显式声明一个数组变量。
declare -a fruits
fruits=("Apple" "Banana" "Orange")
# 等价于
declare -a fruits=("Apple" "Banana" "Orange")
4. 从命令输出创建:将命令的输出结果赋值给数组,每个元素默认为一行输出。
fruits=($(command))
5. 通过字符串拆分创建:通过设置内部字段分隔符(IFS)并拆分字符串来创建数组。
IFS=',' read -ra fruits <<< "Apple,Banana,Orange"
2. 访问数组元素
使用${array_name[index]}
来访问特定索引的元素。
fruits=("Apple" "Banana" "Orange")
echo ${fruits[0]} # 输出: Apple
echo ${fruits[1]} # 输出: Banana
echo ${fruits[2]} # 输出: Orange
# 访问最后一个元素
echo ${fruits[-1]} # 输出: Orange
# 访问所有元素 (相当于 ${fruits[*]} 和 ${fruits[@]})
echo ${fruits[@]} # 输出: Apple Banana Orange
3. 获取数组长度
使用${#array_name[@]}
或${#array_name[*]}
来获取数组的元素个数。
fruits=("Apple" "Banana" "Orange")
echo ${#fruits[@]} # 输出: 3
# 获取单个元素的字符串长度
echo ${#fruits[0]} # 输出: 5 (因为 "Apple" 有 5 个字符)
4. 获取数组的所有索引
使用${!array_name[@]}
或${!array_name[*]}
来获取数组的所有索引。
fruits=("Apple" "Banana" "Orange")
fruits[5]="Mango" # 添加一个跳跃索引的元素
echo ${!fruits[@]} # 输出: 0 1 2 5
5. 遍历数组
使用for
循环,来遍历所有元素。
fruits=("Apple" "Banana" "Orange")
for fruit in "${fruits[@]}"
do
echo "I like $fruit"
done
输出结果:
I like Apple
I like Banana
I like Orange
6. 数组切片
使用${array[@]:start:length}
可以从数组中提取一部分。
fruits=("Apple" "Banana" "Orange" "Mango" "Grape")
echo ${fruits[@]:1:3} # 从索引 1 开始,截取 3 个元素
# 输出: Banana Orange Mango
7. 向数组添加元素
使用+=
即可向原来的数组中添加新元素。
fruits=("Apple" "Banana")
fruits+=("Orange") # 添加一个元素
echo ${fruits[@]} # 输出: Apple Banana Orange
fruits+=("Mango" "Grape") # 添加多个元素
echo ${fruits[@]} # 输出: Apple Banana Orange Mango Grape
关联数组 (Associative Arrays)
Bash 支持关联数组 (Bash 4.0 及以上版本中可用),可以使用任意的字符串、或者整数作为下标来访问数组元素。
1. 创建数组
在 Shell 编程中,有多种方式可以创建索引数组。以下是几种常见的方法:
1. 声明关联数组:必须使用declare -A
命令声明。
declare -A person
person=(["name"]="Kaicz" ["age"]="30" ["city"]="London")
declare -A
:声明关联数组(键值对数组)declare -a
:声明索引数组(普通数字索引数组)
2. 逐个元素赋值:通过指定关联逐个为数组元素赋值。
person["name"]="Kaicz"
person["age"]="30"
person["city"]="London"
2. 访问元素
echo ${person["name"]} # 输出: Kaicz
echo ${person["age"]} # 输出: 30
3. 获取所有键、值、长度
# 获取所有值
echo ${person[@]} # 输出: 30 London Kaicz (顺序可能随机)
echo ${person[*]}
# 获取所有键 (索引)
echo ${!person[@]} # 输出: name age city (顺序可能随机)
echo ${!person[*]}
# 获取数组长度 (元素个数)
echo ${#person[@]} # 输出: 3
4. 遍历关联数组
由于关联数组的键是无序的,遍历顺序也是随机的。
declare -A person=(["name"]="Kaicz" ["age"]="30" ["city"]="London")
for key in "${!person[@]}"
do
echo "Key: $key, Value: ${person[$key]}"
done
可能的输出结果:
Key: city, Value: London
Key: name, Value: Kaicz
Key: age, Value: 30
反馈提交成功
感谢您的反馈,我们将尽快处理您的反馈