'array=X' 总是分配给 bash 中的第一个元素吗?

ill*_*ate 6 bash array

'array=X' 总是分配给 bash 中的第一个元素吗?如果不是,也许我需要一些“例如”来理解 man bash 页面中的以下文本:

分配给索引数组时,如果提供了可选的括号和下标,则将该索引分配给;否则,分配的元素的索引是语句分配的最后一个索引加一。

请。

ilk*_*chu 9

array与 相同array[0],并且$array与 相同${array[0]}。在 Bash 中,0即使array实际上不是数组,也可以使用索引进行引用。但是,使用索引(零或不为零)赋值会将变量转换为数组。

$ array=foo
$ declare -p array         
declare -- array="foo"          # it's not an array
$ echo "${array[0]}"            # we can get the value through index 0
foo
$ declare -p array
declare -- array="foo"          # it's still not an array

$ array[1]=bar
$ declare -p array
declare -a array=([0]="foo" [1]="bar")  # now it is
$ echo $array                           # though this still works..
foo
Run Code Online (Sandbox Code Playgroud)

您引用的手册页/手册的完整部分是:

数组被赋值为使用形式的复合赋值 name=(value1 ... valuen),其中每个值都是这种形式 [subscript]=string。索引数组赋值除了字符串不需要任何东西。分配给索引数组时,如果提供了可选的括号和下标,则将该索引分配给;否则,分配的元素的索引是语句分配的最后一个索引加一。索引从零开始。

它指的是这样的任务:

array=(foo bar)
array=([0]=foo [1]=bar)
Run Code Online (Sandbox Code Playgroud)

以上两个是相等的,因为索引从零开始,并且(以下)未索引的值被放入连续的索引中。同理,下面的两个赋值也是相等的:

array=([123]=foo [124]=bar)
array=([123]=foo bar)
Run Code Online (Sandbox Code Playgroud)

几段之后,明确提到了索引 0 和未索引引用的相等性:

引用一个没有下标的数组变量等同于引用一个下标为 的数组0。任何使用有效下标对变量的引用都是合法的,如有必要,bash 将创建一个数组。