主题
  • 默认模式
  • 浅蓝色模式
  • 淡绿色模式
  • 深夜模式

Shell 数组

在 Shell 编程中,数组是一种非常重要且实用的数据结构,它允许在单个变量中存储多个值。与某些编程语言类似,Shell 数组的索引从 0 开始,并且其长度没有固定限制。

Shell 主要支持两种数组:

  • 索引数组 (Indexed Arrays):使用整数作为索引(从0开始)。
  • 关联数组 (Associative Arrays):使用字符串作为索引(类似于其他语言中的 Map 或 Dictionary)。

需要注意的是,Bash 是 Shell 中最常用的,它对数组的支持最完善。原始的 Bourne Shell (/bin/sh) 并不支持数组,因此下面的内容主要基于 Bash。


索引数组 (Indexed Arrays)

索引数组是最常见的数组类型,使用整数索引来访问元素。以下索引数组结构图:

索引数组结构图

1. 创建数组

在 Shell 编程中,有多种方式可以创建索引数组。以下是几种常见的方法:

1. 直接赋值创建:使用赋值语句直接初始化数组,元素放在括号中,用空格分隔。

bash
复制
fruits=("Apple" "Banana" "Orange")    # 创建一个包含多个元素的数组
empty_array=()                        # 创建一个空数组

2. 逐个元素赋值:通过指定索引逐个为数组元素赋值。

bash
复制
fruits[0]="Apple"
fruits[1]="Banana"
fruits[2]="Orange"
# 甚至可以跳过索引,下面的数组长度是 2,但有一个索引是 5
fruits[5]="Mango"

3. 使用 declare 命令:使用declare -a显式声明一个数组变量。

bash
复制
declare -a fruits
fruits=("Apple" "Banana" "Orange")
# 等价于
declare -a fruits=("Apple" "Banana" "Orange")

4. 从命令输出创建:将命令的输出结果赋值给数组,每个元素默认为一行输出。

bash
复制
fruits=($(command))

5. 通过字符串拆分创建:通过设置内部字段分隔符(IFS)并拆分字符串来创建数组。

bash
复制
IFS=',' read -ra fruits <<< "Apple,Banana,Orange"

2. 访问数组元素

使用${array_name[index]}来访问特定索引的元素。

bash
复制
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[*]}来获取数组的元素个数。

bash
复制
fruits=("Apple" "Banana" "Orange")
echo ${#fruits[@]} # 输出: 3

# 获取单个元素的字符串长度
echo ${#fruits[0]} # 输出: 5 (因为 "Apple" 有 5 个字符)

4. 获取数组的所有索引

使用${!array_name[@]}${!array_name[*]}来获取数组的所有索引。

bash
复制
fruits=("Apple" "Banana" "Orange")
fruits[5]="Mango" # 添加一个跳跃索引的元素

echo ${!fruits[@]} # 输出: 0 1 2 5

5. 遍历数组

使用for循环,来遍历所有元素。

bash
复制
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}可以从数组中提取一部分。

bash
复制
fruits=("Apple" "Banana" "Orange" "Mango" "Grape")

echo ${fruits[@]:1:3} # 从索引 1 开始,截取 3 个元素
# 输出: Banana Orange Mango

7. 向数组添加元素

使用+=即可向原来的数组中添加新元素。

bash
复制
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命令声明。

bash
复制
declare -A person
person=(["name"]="Kaicz" ["age"]="30" ["city"]="London")
  • declare -A:声明关联数组(键值对数组)
  • declare -a:声明索引数组(普通数字索引数组)

2. 逐个元素赋值:通过指定关联逐个为数组元素赋值。

bash
复制
person["name"]="Kaicz"
person["age"]="30"
person["city"]="London"

2. 访问元素

bash
复制
echo ${person["name"]} # 输出: Kaicz
echo ${person["age"]}  # 输出: 30

3. 获取所有键、值、长度

bash
复制
# 获取所有值
echo ${person[@]}  # 输出: 30 London Kaicz (顺序可能随机)
echo ${person[*]}

# 获取所有键 (索引)
echo ${!person[@]} # 输出: name age city (顺序可能随机)
echo ${!person[*]}

# 获取数组长度 (元素个数)
echo ${#person[@]} # 输出: 3

4. 遍历关联数组

由于关联数组的键是无序的,遍历顺序也是随机的。

bash
复制
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


评论区 0
发表评论