Bash通过函数声明关联数组给出非关联数组

时间:2020-01-30 11:59:48

标签: arrays bash shell

我试图通过一个函数声明一个关联数组,但我发现该关联数组变成了一个普通数组。测试代码如下:

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)

1 个答案:

答案 0 :(得分:1)

help declare

在函数中使用时,declarelocal命令一样,使名称成为本地

这意味着在createArr之外,未声明array1。像array1[1]=1这样的赋值未设置array1的情况意味着array1是一个常规的索引数组。

在函数中使用-g标志可以解决此问题

createArr() { declare -gA "$1"; }