我需要运行一个脚本,其中有一个id数组,一个json,其中包含具有这些id的元素和更多的数据。我需要过滤/选择与数组中的值匹配的值。由于某种原因,当直接在bash上运行时,我得到了很好的结果,其中一些我已经尝试过了。但不是在运行脚本时。不确定这是否相关,或者我在从一个传递到另一个时做错了什么
例如,如果我有一个json文件
[
{
"id": 1,
"value": 10
},
{
"id": 2,
"value": 100
},
{
"id": 3,
"value": 5
},
{
"id": 4,
"value": 17
},
{
"id": 5,
"value": 84
}
]
和以下数组:
IDS=(1 2 3 4)
我需要检索值10、100、5和17。
我试过一些方法:
VALUES=$(jq --argjson IDS "$IDS" '.[] | select( $IDS =~ .id ) | .value' file.json)
VALUES=$(jq --argjson IDS "$IDS" '.[] | select( ${IDS[*]} =~ .id ) | .value' file.json)
# I have certainty that IDS will always have 4 elements, no more no less
VALUES=$(jq --argjson IDS "$IDS" '.[] | select( .id == ${IDS[0]} | .id == ${IDS[1]} | .id == ${IDS[2]} | .id == ${IDS[3]} ) | .value' file.json)
在所有情况下,我都得到'意外的INVALID_CHARACTER(Unix shell引用问题?)
同样,在最后一个例子中,当我用硬编码的数字替换${IDS [n ]}时,它工作得很好,但是,我不会在每次运行中得到相同的数字,所以我需要将其参数化。
任何帮助都很好!
编辑
谢谢大家的解答。我暂时保留了我最理解的一个,但是我真的很满意所有的解答
4条答案
按热度按时间fykwrbwg1#
使用
--arg
,然后将Bash数组转换为JSON整数:合并
select()
和index()
:给出:
lmvvr0a82#
一种方法是创建可接受ID的Map,然后在其中进行查找:
wgmfuz8q3#
或者,使用
--args "${ids[@]}"
将ids
个单独的数组元素作为参数传递给jq
,然后使用mapfile
将值读回到bash数组中:样本输出:
myzjeezk4#
你要找的东西是这样的: