Bash 中支持定义一维数组,数组中的元素无需连续,也没有数量上限。其可定义的数组类型有两种:数字索引数组和关联数组(字符串索引数组)。
创建数组
Bash 中提供了三种创建数组的方式:
arr[index]=value
1  | arr[0]=a  | 
arr=(a b c)
该种方式还可以手动指定索引号:
1  | arr=(a [3]=b c) // c 的索引号是 4,紧接着 b 之后  | 
还可以使用扩展符,例如自动扩展成文件列表:
1  | txts=( *.txt )  | 
- 使用 declare 声明:
 
1  | declare -a arr  | 
数组的访问
数组访问时,必须在 ${} 中,并指定索引号:
1  | echo ${arr[1]}  | 
如果没有指定索引号,则返回 arr[0] 的值,设置元素时,如果没有使用索引,也默认索引为 0:
1  | declare -a arr  | 
读取所有元素
- 可以使用 
@或*获取数组的所有元素: 
1  | arr=(a b c)  | 
- 可以配合 
for..in循环遍历数组: 
1  | for a in "${arr[@]}"; do  | 
注意,遍历数组时,建议将数组放到 "" 中,避免数组中的元素内含有空格,导致该元素被当做空格间隔的多个元素遍历。
例如:
1  | arr=("a b" c) // 两个元素  | 
- 可以使用此方式复制、添加数组:
 
1  | new_arr=("${arr[@]}")  | 
数组的长度
获取数组长度的方法:
1  | echo ${#arr[@]}  | 
获取的数组长度是有值的元素个数(包含空字符串),注意,在其他 SHELL 中(例如 zsh),可能表现的不一致。
取数组索引列表
获取数组中有值得数据索引号:
1  | echo ${!arr[@]} // 索引号空格隔开,形如 2 4 5  | 
可以配合 for..in 循环遍历数组:
1  | for i in ${!arr[@]}; do  | 
数组的截取
可以使用索引号,截取数组中的一部分元素内容:
1  | echo ${arr[@]:position:length} // 从 position 位置的元素开始(包含),截取 length 个元素  | 
如果不指定 length,则表示截取到数组末尾:
1  | echo ${arr[@]:3:4} // 从索引 3 开始,截取 4 个元素  | 
追加数组元素
可以使用 += 在数组末尾增加元素:
1  | arr=(1 2 3)  | 
删除数组元素
可以使用 unset 命令删除元素中的成员:
1  | unset arr[1]  | 
清空整个数组可以直接 unset arr
关联数组
关联数组即是用字符串当做索引的数组:
1  | declare -A arr  | 
使用关联数组是,必须显示的使用 declare -A 进行声明:
1  | declare -A arr  | 
赋值方式有两种:
1  | arr['name']='My Name'  |