Arrays

Bash 提供了一维数组变量。任何变量都可以作为一个数组;内建命令 declare 可以显式地定义数组。数组的大小没有上限,也没有限制在连续对成员引用和 赋值时有什么要求。数组以整数为下标,从 0 开始。

如果变量赋值时使用语法 name[subscript]=value, 那么就会自动创建数组。 subscript 被当作一个算术表达式,结果必须是大于等于 0 的值。要显式地定义一个数组,使用 declare -a name (参见下面的 shell 内建命令(SHELL BUILTIN COMMANDS) 章节)。也可以用 declare -a name[subscript] 这时 subscript 被忽略。数组变量的属性可以用内建命令 declarereadonly 来指定。每个属性对于所有数组元素都有效。

数组赋值可以使用复合赋值的方式,形式是 name=(value1 ... valuen),这里每个 value 的形式都是 [subscript]=stringstring 必须出现。如果出现了可选的括号和下标,将为这个下标赋值,否则 被赋值的元素的下标是语句中上一次赋值的下标加一。下标从 0 开始。 这个语法也被内建命令 declare 所接受。单独的数组元素可以用上面介绍的语法 name[subscript]=value 来赋值。

数组的任何元素都可以用 ${name[subscript]} 来引用。 花括号是必须的,以避免和路径扩展冲突。如果 subscript@ 或是 *,它扩展为 name 的所有成员。 这两种下标只有在双引号中才不同。在双引号中,${name[]} 扩展为一个词, 由所有数组成员的值组成,用特殊变量 IFS 的第一个字符分隔;${name[@]} 将 name 的每个成员扩展为一个词。 如果数组没有成员,${name[@]} 扩展为空串。这种不同类似于特殊参数 **@ 的扩展 (参见上面的 Special Parameters 段落)。${#name[subscript]} 扩展为 ${name[subscript]} 的长度。如果 subscript* 或者是 @,扩展结果是数组中元素的个数。引用没有下标数组变量等价于 引用元素 0。

内建命令 unset 用于销毁数组。unset name[subscript] 将销毁下标是 subscript 的元素。 unset name, 这里 name 是一个数组,或者 unset name[subscript], 这里 subscript* 或者是 @,将销毁整个数组。

内建命令 declare, local, 和 readonly 都能接受 -a 选项,从而指定一个数组。内建命令 read 可以接受 -a 选项,从标准输入读入一列词来为数组赋值。内建命令 setdeclare 使用一种可以重用为输入的格式来显示数组元素。