'array=X' 总是分配给 bash 中的第一个元素吗?如果不是,也许我需要一些“例如”来理解 man bash 页面中的以下文本:
分配给索引数组时,如果提供了可选的括号和下标,则将该索引分配给;否则,分配的元素的索引是语句分配的最后一个索引加一。
请。
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 将创建一个数组。