创建 bash 数组是否需要 -a 标志?

Is the -a flag necessary to create a bash array?

使用如下 -a 标志声明 bash 数组的附加值是什么:

带有标志

declare -a arr1
arr1[0]="array1-zero"
arr1[1]="array1-one"
echo ${arr1[0]}
echo ${arr1[1]}

...当您省略该选项时行为相同,如下所示:

没有 -a 选项

declare arr2
arr2[0]="array2-zero"
arr2[1]="array2-one"
echo ${arr2[0]}
echo ${arr2[1]}

关联数组也是如此(选项-A)。 省略它呈现与提供它相同的结果。

对于数字索引数组,您可以跳过 declare -a,但对于关联数组,您不能跳过 declare -A。为了证明后者:

declare array
array[one]=1
array[two]=2
echo "${array[one]}"

...发出:

2

为什么?我们用declare -p array来看:

$ declare -p array
declare -a array='([0]="2")'

单词 onetwo 都被强制转换为数值 0,因此它们覆盖了相同的键。


也就是说,declare -a array 不是一个完整的空洞。比较:

unset array # start from a blank slate
declare -a array
declare -p array

...发出:

declare -a array='()'

而如果我们省略 -a,我们会看到没有分配任何类型数据,因此我们的变量被假定为只是一个字符串,直到它以一种明确的方式分配给它应该成为一个数组:

unset array # start from a blank slate
declare array
declare -p array

...发出 declare -- array="",除非有赋值:

unset array # start from a blank slate
declare array
array[0]="zero"
declare -p array

...正确发出 declare -a array='([0]="zero")',这意味着在上面的代码中,只有在 array[0]="zero" 行之后 array 实际上变成了一个数组。