【发布时间】:2021-09-29 22:46:14
【问题描述】:
我有以下代码读取 Json 文件的所有 fields(路径为 PRIVATE_REGISTRATION_FILE 并将它们存储到关联数组 (PRIVATE_FIELDS) 中,稍后我会在我的代码中查询该数组:
declare -A PRIVATE_FIELDS
for PRICING_FIELD in $(jq -c -r '.fields[]' "${PRIVATE_REGISTRATION_FILE}")
do
FIELD_KEY=$(jq -r '.label' <<< "${PRICING_FIELD}")
PRIVATE_FIELDS["${FIELD_KEY}"]=${PRICING_FIELD}
done
问题是我用几个文件多次执行此操作,即使逻辑始终相同。
因此,我想将此逻辑提取到一个函数中,但我很难将 map 参数传递给它。
这是我尝试的:
function update_array
{
FILE_NAME=$1
eval "declare -A MAP="${2#*=}
for PRICING_FIELD in $(jq -c -r '.fields[]' "${FILE_NAME}")
do
FIELD_KEY=$(jq -r '.label' <<< "${PRICING_FIELD}")
MAP["${FIELD_KEY}"]=${PRICING_FIELD}
done
}
我这样称呼:
declare -A PRIVATE_FIELDS
update_array "myFile.json" "$(declare -p PRIVATE_FIELDS)"
但它不起作用,地图仍然是空的。
echo ${PRIVATE_FIELDS["someKey"]}
>>> (empty)
我已经尝试了in this answer 提出的每个解决方案,但都没有奏效。我做错了什么?
Bash 版本:4.2.46(2)-release
补充说明,Json 文件长这样(显然对jq 的调用可能会减少):
{
"name": "Something",
"fields": [
{
"label": "key1",
"value": "value1",
"other": "other1"
},
{
"label": "key2",
"value": "value2",
"other": "other2"
}
]
}
【问题讨论】:
-
$1函数内部是传递给它的第一个参数,在您的情况下为"$(declare -p PRIVATE_FIELDS)"但您的代码似乎是指脚本的第一个参数。 -
@LMC 抱歉,我粘贴了错误的示例,我已正确更新了我的问题。感谢您发现
-
您可以在函数内部使用 PRIVATE_FIELDS,无需创建另一个变量。
-
顺便说一句,
function关键字是 bash 支持向后兼容 pre-POSIX ksh 的东西。最好只使用update_array() {而不使用function来编写与其他 POSIX 系列 shell 更兼容的代码;请参阅wiki.bash-hackers.org/scripting/obsolete 中的两个相关条目(第一个讨论function update_array() {,它与ksh 或POSIX 都不兼容;第二个讨论function update_array {legacy-ksh 形式) . -
@PaulHodges,OP 的 bash 版本太旧,无法支持 namerefs(因此不接受 glenn 的回答,并且正在更新问题以反映他们正在运行的版本)。