微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 bash 函数中声明与关联数组无法按预期工作

如何解决在 bash 函数中声明与关联数组无法按预期工作

我声明了一个关联数组:

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

解决方法

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

的输出

声明 -n dict_ref=dikv

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

你可以做一个

declare -p "$1" >$FILE

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。