【问题标题】:declare inside a bash funcion not working as expected with associative arrays在 bash 函数中声明不能按预期使用关联数组
【发布时间】: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


【解决方案1】:

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

声明 -n dict_ref=dikv

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

你可以做一个

declare -p "$1" >$FILE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 2011-11-24
    • 2019-10-26
    相关资源
    最近更新 更多