bash - 在函数内添加到 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 之类的东西?
解决方案
编辑:找到重复的。这与此答案基本相同。
您可以为此使用参考变量,请参阅help declare
:
declare [-aAfFgilnrtux] [-p] [name[=value] ...]
[...]引用由其值命名的变量 [...] 在函数中使用时,
-n
使s成为局部变量,就像使用命令一样。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
因为它只会显示引用。
推荐阅读
- javascript - 创建可编辑的内联文本区域
- spring-mvc - MultipartFile 始终为空 Spring MVC 为上传 Excel 返回响应 400
- pandas - Pandas 中的条件合并
- react-native - 我可以在 React Native 中使用 Stripe 支付网关创建多用途令牌吗?
- javascript - preventDefault 输入键事件而不阻止滚动
- cmake - 如何让 CMake 在后续运行中跳过 ExternalProject?
- loops - 编译器错误在循环 SQL 中选择单个计数
- camera - hasSystemFeature(PackageManager.FEATURE_CAMERA) 在 Android 上返回 false 吗?
- c++ - 为什么当我通过引用传递形式参数时我的原始变量没有改变?
- json - 使用 Selenium 解析来自 Pushbullet 的最后一条消息