我试图通过一个函数声明一个关联数组,但我发现该关联数组变成了一个普通数组。测试代码如下:
bash-5.0$ cat test.sh
#!/bin/bash
createArr(){ declare -A "$1"; }
# create array using `createArr'
name=array1
createArr $name
array1[1]=1
echo "${!array1[@]}"
array1[a]=1
echo "${!array1[@]}"
declare -p array1
# create array directly
name=array2
declare -A $name
array2[1]=1
echo "${!array2[@]}"
array2[a]=1
echo "${!array2[@]}"
declare -p array2
执行代码会得到以下结果:
bash-5.0$ ./test.sh
1
0 1
declare -a array1=([0]="1" [1]="1")
1
1 a
declare -A array2=([1]="1" [a]="1" )
我想知道为什么结果不同,谢谢! (我的bash版本是5.0.11)
答案 0 :(得分:1)
help declare
说
在函数中使用时,
declare
与local
命令一样,使名称成为本地。
这意味着在createArr
之外,未声明array1
。像array1[1]=1
这样的赋值未设置array1
的情况意味着array1
是一个常规的索引数组。
在函数中使用-g
标志可以解决此问题
createArr() { declare -gA "$1"; }