在函数内部添加到Bash关联数组

问题描述 投票:0回答:1

我正在尝试使用关联数组来解决Bash较差的函数参数传递的问题。我可以声明一个全局assoc数组并对其进行读/写操作,但是我想将变量名传递给该函数,因为很多时候我想将同一函数与不同的参数块一起使用。各种Stack Overflow帖子都提供了一些方法来读取函数中的传递数组,但不对其进行写入以允许返回值。我想做的是伪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之类的东西吗?

bash function associative-array
1个回答
0
投票

EDIT:这基本上与this one相同。


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

declare [-aAfFgilnrtux] [-p] [name[=value] ...] [...] -n使NAME引用以其值命名的变量 [...] declare用于功能时,与NAME命令一样,使local在本地。

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打印引用的数组,因为这只会显示引用。

© www.soinside.com 2019 - 2024. All rights reserved.