创建 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")'
单词 one
和 two
都被强制转换为数值 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
实际上变成了一个数组。
使用如下 -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")'
单词 one
和 two
都被强制转换为数值 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
实际上变成了一个数组。