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

smi*_*lov 4 arrays bash associative-array declare

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

与国旗

declare -a arr1
arr1[0]="array1-zero"
arr1[1]="array1-one"
echo ${arr1[0]}
echo ${arr1[1]}
Run Code Online (Sandbox Code Playgroud)

...如果省略该选项,行为是相同的,如下所示:

没有-a选项

declare arr2
arr2[0]="array2-zero"
arr2[1]="array2-one"
echo ${arr2[0]}
echo ${arr2[1]}
Run Code Online (Sandbox Code Playgroud)

关联数组(选项-A)也是如此.省略它会产生与提供它相同的结果.

Cha*_*ffy 6

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

declare array
array[one]=1
array[two]=2
echo "${array[one]}"
Run Code Online (Sandbox Code Playgroud)

...发出:

2
Run Code Online (Sandbox Code Playgroud)

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

$ declare -p array
declare -a array='([0]="2")'
Run Code Online (Sandbox Code Playgroud)

单词onetwo都被强制为数值0,所以他们覆盖了相同的键.


那说,declare -a array不是一个完整的noop.相比:

unset array # start from a blank slate
declare -a array
declare -p array
Run Code Online (Sandbox Code Playgroud)

...发出:

declare -a array='()'
Run Code Online (Sandbox Code Playgroud)

然而,如果我们遗漏了-a,我们看到没有分配类型数据,所以假设我们的变量只是一个字符串,直到它被分配给一个明确它应该是一个数组的方式:

unset array # start from a blank slate
declare array
declare -p array
Run Code Online (Sandbox Code Playgroud)

...发出declare -- array="",除非有作为任务:

unset array # start from a blank slate
declare array
array[0]="zero"
declare -p array
Run Code Online (Sandbox Code Playgroud)

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