shell(5)数组

在 Shell 脚本中(特别是 Bash),数组是一种非常有用的数据结构,可以用来存储多个值。

1. 声明数组

在 Bash 中,可以通过以下方式声明一个数组:

1
array_name=(value1 value2 value3)
  • array_name 是数组的名称。
  • 用空格分隔的 value1 value2 value3 是数组的元素。
1
fruits=(apple banana orange)

1.逐个赋值

array_name[0]=xx
array_name[1]=yy
...

2.分割赋值

array_name=(
value0
value1
value2
value3
)

2. 访问数组元素

使用索引来访问数组中的元素,索引从 0 开始:

1
2
echo ${fruits[0]}  # 输出: apple
echo ${fruits[1]} # 输出: banana

3. 获取所有元素

使用 @* 可以访问数组的所有元素:

1
2
echo ${fruits[@]}  # 输出: apple banana orange
echo ${fruits[*]} # 输出: apple banana orange
  • ${fruits[@]}${fruits[*]} 的区别在于,@ 会保留元素的独立性(适合循环),而 * 会将所有元素合并为一个字符串。

4. 获取数组长度

使用 # 可以获取数组的元素个数:

1
echo ${#fruits[@]}  # 输出: 3

5. 遍历数组

可以用 for 循环遍历数组:

1
2
3
for fruit in "${fruits[@]}"; do
echo $fruit
done

输出:

apple
banana
orange

6. 添加元素

可以通过指定索引或使用 += 添加元素:

1
2
3
fruits[3]=grape       # 指定索引添加
fruits+=(pear) # 使用 += 添加一个或多个元素
echo ${fruits[@]} # 输出: apple banana orange grape pear

7. 删除元素

使用 unset 删除指定索引的元素:

1
2
unset fruits[1]       # 删除索引 1 的元素 (banana)
echo ${fruits[@]} # 输出: apple orange grape pear

注意:删除后,数组的索引不会自动重新排序,可能会出现空隙

# 数组替换
echo ${arr[@]}
${arr[@]/oldstr/newstr}
${arr[@]//oldstr/newstr}
${arr[@]//oldstr/}   # 删除

8. 示例脚本

以下是一个简单的 Shell 脚本示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# 声明数组
colors=(red blue green yellow)

# 遍历并打印
for color in "${colors[@]}"; do
echo "Color: $color"
done

# 添加元素
colors+=(purple)

# 打印数组长度
echo "Total colors: ${#colors[@]}"

# 打印所有元素
echo "All colors: ${colors[@]}"

运行结果:

Color: red
Color: blue
Color: green
Color: yellow
Total colors: 5
All colors: red blue green yellow purple