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

时间:2018-12-01 18:29:55

标签: arrays bash associative-array declare

使用如下所示的-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)。 省略它可以提供与提供相同的结果。

1 个答案:

答案 0 :(得分:6)

对于数字索引数组,您可以跳过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实际上才变成数组。