数组(array)是一个包含多个值得变量。 成员的编号从 0 开始,数量没上线,也没要求成员被连续索引。
写法:
# ARRAY 是数组的变量名。
# INDEX 是索引,一个大于等于零的整数,也可以是算术表达式。
ARRAY[INDEX]=value
创建一个三个成员的数组
# 写法一
array[0]=val1
array[1]=val2
array[2]=val3
# 写法二
array=(val1 val2 val3)
# 指定索引,如果不指定,则是默认索引
array=(val2 [2]=val1 [1]=val3)
# 写法三
array=(
val1
val2
val3
)
定义数组的时候,可以使用通配符。
# 把当前目录下,所有 MP3 结尾的文件,放在一个数组
mp3s=( *.mp3 )
读取数组某个位置的成员,使用下面的语法
# i 是索引
# 大括号不可省略
echo ${array[i]}
@
和 *
是数组的特殊索引,表示返回数组的所有成员。
foo=(a b c d e f g h i j)
echo ${foo[@]}
# or
echo ${foo[*]}
遍历数组
# 注意,遍历数组的时候,变量有没双引号,Bash 有区别,建议加上。
names=( Peter-Wang "Ali Alina Wang" San-Zhang "Si Li" )
for i in "${names[@]}"; do
echo $i
done
# 上面输出 4 个元素
# 下面输出 7 个元素
for i in ${names[@]} ; do
echo $i
done
拷贝数组
arr=(1 2 3 4 5)
arr2=("${arr[@]}" 6)
echo "${arr2[@]}"
如果读取数组成员时,没指定读哪个位置,默认使用索引 0
。
declare -a foo
foo=A
echo ${foo[0]}
检查数组长度,语法。
arr=(1 2 3)
${#arr[@]}
# or
${#arr[*]}
注意,用此语法去读某个元素的长度时,写法如下:
arr[100]=foo
${#arr[100]}
# 输出 3
提取数组中,有值的数组序号
arr=([5]=a [9]=b [23]=c)
${!arr[@]}
#or
${!arr[*]}
遍历数组有值元素例子:
arr=([5]=a [9]=b [23]=c)
for i in ${!arr[@]}; do
echo ${arr[i]}
done
${array[@]:position:length}
的语法可以提取数组成员。
food=( apples bananas cucumbers dates eggs fajitas grapes )
echo ${food[@]:1:1}
# 输出 bananas
echo ${food[@]:1:3}
# 输出 bananas cucumbers dates
# 可以不输入长度,截取 position 后全部
echo ${food[@]:4}
# 输出 eggs fajitas grapes
可是使用 +=
赋值运算,自动追加到数组末尾。
foo=(a b c)
foo+=(d e f)
echo ${foo[@]}
# 输出 a b c d e f
删除一个数组成员。注意:不影响索引。
以下办法:
- 使用
unset
命令(推荐) - 对目标下标赋值为空值
foo=(a b c d)
# unset
unset foo[2]
echo ${foo[@]}
# 输出 a b d
# 赋空值
foo[2]=''
echo ${foo[@]}
# 输出 a b
# 输出数组头部成员
foo=''
echo ${foo[@]}
# 输出 b
删除整个数组。
arr=(a b c)
unset arr
新版本可以声明关联数组,实现非整数索引(类似编程语言中的Map)。
declare -A colors
colors["red"]="#ff0000"
colors["green"]="#00ff00"
colors["blue"]="#0000ff"
旧版本无法使用,暂不记录。