Shell数组¶
普通数组¶
和其它编程语言一样, Shell也支持数组. 数组(Array) 是若干数据的集合, 其中的每一个数据都称为元素(Element).
- Bash Shell支持一维数组(不支持多维数组), 初始化时不需要指定数组大小;
- 使用圆括号来定义数组, 数组元素之间用空格分隔;
- 数组元素可以是不同的类型;
- 使用下标引用数组元素, 下标从0开始, 下标可以是整数或算术表达式, 其值应该大于或等于0.
定义数组¶
在Shell中, 用圆括号()来定义数组, 数组元素之间用空格分隔.
- 定义数组的一般形式为:
array_name=(ele1 ele2 ele3 ... elen)
注意, 和变量定义一样, =两侧不能有空格.
Example:
nums=(1 2 3 4 5)
- 在Shell中, 数组元素可以是不同类型的.
Example:
arr=(1 2 3 "hello" "world")
- 可以单独定义数组的某个元素, 可以使用不连续的下标, 且下标范围没有限制.
Example:
array_name[0]=0
array_name[5]=5
array_name[100]=100
获取数组元素¶
- 获取数组元素的值和读取变量的值类似, 其一般形式为:
${arrayName[index]}
- 使用
@或*符号作为索引值可以获取数组中的所有元素, 其一般形式为:
${arrayName[@]}
# or
${arrayName[*]}
Example:
array=(1 2 "hello" "world")
echo ${array[@]}
获取数组的长度¶
- 获取数组长度的方法与获取字符串长度的方法相同, 其一般形式为:
${#arrayName[@]}
# or
${#arrayName[*]}
- 获取数组中单个元素的长度:
${#arrayName[n]}
数组拼接¶
所谓数组拼接(数组组合), 就是将两个数组连接成一个数组.
拼接数组的思想是: 先利用@或*将数组展开成列表, 然后再合并到一起, 具体格式如下:
array_new=(${array1[@] ${array2[@])
array_new=(${array1[*] ${array2[*])
两种方式是等加的, 选择其一即可.
删除数组元素¶
删除数组元素和删除变量一样, 使用unset关键字, 具体格式如下:
unset array_name[index]
如果不写下标, 而是下面的形式:
unset array_name
表示删除整个数组.
关联数组¶
现在最新的Bash Shell已经支持关联数组了. 关联数组使用字符串作为下标, 而不是整数, 这样可以做到见名知意.
关联数组也称为”键值对(key-value)”, 键(key)也即字符串形式的数组下标, 值(value)也即元素值.
不同于普通数组, 关联数组必须使用带有-A选项的declare命令创建.
Example:
declare -A color
color["red"]="#ff0000"
color["green"]="#00ff00"
color["blue"]="#0000ff"
也可以在定义的同时赋值:
declare -A color=(["red"]="#ff0000", ["green"]="#00ff00", ["blue"]="#0000ff")
访问关联数组¶
访问关联数组元素的方式几乎与普通数组相同, 具体形式:
array_name["index"]
Example:
color["while"]="#ffffff"
color["black"]="#000000"
加上${}即可获得数组元素的值:
${array_name["index"]}
Example:
echo ${color["while"]}
while=${color["while"]}
获取所有元素的下标和值¶
使用下面的形式可以获得关联数组的所有元素值:
${array_name[*]}
${array_name[@]}
使用下面的形式可以获取关联数组的所有下标值:
${!array_name[*]}
${!array_name[@]}
获取关联数组长度¶
使用下面的形式可以获得关联数组的长度:
${#array_name[*]}
${#array_name[@]}
Example:
#!/usr/bin/env bash
declare -A color
color["red"]="#ff0000"
color["green"]="#00ff00"
color["blue"]="#0000ff"
color["white"]="#ffffff"
color["black"]="#000000"
# 获取所有元素值
for value in ${color[*]}
do
echo $value
done
echo "************"
# 获取所有元素下标(键)
for key in ${!color[*]}
do
echo $key
done
echo "************"
# 列出所有键值对
for key in ${!color[*]}
do
echo "${key} -> ${color[$key]}"
done