首页 > 解决方案 > 在函数内添加到 Bash 关联数组

问题描述

我正在尝试使用关联数组来解决 Bash 糟糕的函数参数传递问题。我可以声明一个全局关联数组并对其进行读/写,但我希望将变量名传递给函数,因为很多时候我想使用具有不同参数块的相同函数。

各种 Stack Overflow 帖子都有在函数中读取传递的数组但不写入以允许返回值的方法。因此,我正在尝试做的 Pseudo Bash 是:

TestFunc() {
    local __PARMBLOCK__=${1} # Tried ${!1} as well

    # Do something with incoming array

    __PARMBLOCK__[__rc__]+=1 # Error occured
    __PARMBLOCK__[__error__]+="Error in TestFunc"
}

declare -A FUNCPARM

# Populate FUNCPARM
TestFunc FUNCPARM
if [[ ${FUNCPARM[__rc__]} -ne 0 ]]; then
    echo "ERROR : ${FUNCPARM[__error__]}
fi

这种事情是可能的,还是我真的需要放弃 Bash 来使用 Python 之类的东西?

标签: bashfunctionassociative-array

解决方案


编辑:找到重复的。这与此答案基本相同。


您可以为此使用参考变量,请参阅help declare

declare [-aAfFgilnrtux] [-p] [name[=value] ...]
[...]引用由其值命名的变量 [...] 在函数中使用时,
-n使s成为局部变量,就像使用命令一样。NAME

declareNAMElocal

f() {
  declare -n paramblock="$1"
  # example for reading (print all keys and entries)
  paste <(printf %s\\n "${!paramblock[@]}") <(printf %s\\n "${paramblock[@]}")
  # example for writing
  paramblock["key 1"]="changed"
  paramblock["new key"]="new output"
}

示例用法:

$ declare -A a=(["key 1"]="input 1" ["key 2"]="input 2")
$ f a
key 2   input 2
key 1   input 1
$ declare -p a
declare -A a=(["key 2"]="input 2" ["key 1"]="changed" ["new key"]="new output" )

这很好用。到目前为止,与我发现的实际关联数组的唯一区别是,您不能使用打印引用的数组,declare -p因为它只会显示引用。


推荐阅读