【发布时间】:2021-04-27 06:33:11
【问题描述】:
我声明了一个关联数组:
$ declare -A dikv
用一些键/值对初始化它:
$ dikv=( ["k1"]="v1" ["k2"]="v2" ["k3"]="v3" ["k4"]="v4")
然后我可以将内容保存到文件中:
$ declare -p dikv > /tmp/dikv.saved
这是/tmp/dikv.saved的内容:
$ cat /tmp/dikv.saved
declare -A dikv=([k4]="v4" [k1]="v1" [k2]="v2" [k3]="v3" )
现在,在一个新的 shell 环境中,我可以加载保存的关联数组:
$ source /tmp/dikv.saved
并且内容可以正常访问:
$ echo "${!dikv[@]}"
k4 k1 k2 k3
$ echo "${dikv[@]}"
v4 v1 v2 v3
这按预期工作,很好。
现在我想做同样的事情,但使用 bash 函数:
#! /bin/bash
declare -A dikv
backup_dictionary()
{
local -n dict_ref=$1
FILE=$2
echo "${!dict_ref[@]}"
echo "${dict_ref[@]}"
declare -p dict_ref > $FILE
}
dikv=( ["k1"]="v1" ["k2"]="v2" ["k3"]="v3" ["k4"]="v4")
backup_dictionary dikv /tmp/dikv.saved
如您所见,我使用 local -n 将关联数组传递给函数。当我运行这段代码时,函数内部的回显会正确打印关联数组的内容。因此,据我了解,关联数组已作为参数正确传递。
但是,此语句未按预期工作:
$ declare -p dict_ref > $FILE
这是 $FILE 的内容:
$ cat /tmp/dikv.saved
declare -n dict_ref="dikv"
我希望看到这样的东西:
dikv=( ["k1"]="v1" ["k2"]="v2" ["k3"]="v3" ["k4"]="v4")
不使用 bash 函数时会发生这种情况。你能解释一下这里发生了什么吗?解决这个问题的正确方法应该是什么?谢谢!
【问题讨论】:
-
关联数组已作为参数正确传递 ...不。数组的名称已作为参数正确传递。数组本身仍然是全局的;您正在通过其名称间接访问它。想想 C 语言中的指针:如果将指向某个数据结构的指针传递给函数,则不会传递数据结构本身。
-
@user1934428 感谢您的解释,这是有道理的。
标签: arrays bash declare associative