在 bash 函数中声明不能按预期使用关联数组

declare inside a bash funcion not working as expected with associative arrays

我声明了一个关联数组:

$ declare -A dikv

用一些 key/value 对初始化它:

$ dikv=( ["k1"]="v1" ["k2"]="v2" ["k3"]="v3" ["k4"]="v4")

然后我可以将内容保存到文件中:

$ declare -p dikv > /tmp/dikv.saved

这是/tmp/dikv的内容。已保存:

$ 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=
    FILE=

    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 将关联数组传递给函数。当我 运行 这段代码时,函数内部的 echo 会正确打印关联数组的内容。因此,据我了解,关联数组已作为参数正确传递。

但是,此语句未按预期工作:

$ 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 函数时会发生这种情况。你能解释一下这里发生了什么吗?解决这个问题的正确方法应该是什么?谢谢!

您的 dict_ref 存储字符串 dikv。因此,如果您执行 declare -p dict_ref,我希望看到类似

的输出

声明-n dict_ref=dikv

请注意,取消引用(由于 -n 声明)发生在参数扩展期间,即当您执行 $dict_ref.

你可以做一个

declare -p "" >$FILE