在 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
我声明了一个关联数组:
$ 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