我正在尝试使用关联数组来解决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之类的东西吗?
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
打印引用的数组,因为这只会显示引用。