如何通过Bash变量结合jq提取指定前缀的JSON字段值
使用Bash变量动态指定jq提取的JSON字段
问题场景
我有如下JSON数据:
$ echo '[{"my_var1":"valueA", "my_var2": "valueB"}]' [{"my_var1":"valueA", "my_var2": "valueB"}]
直接提取my_var2的值很简单:
$ echo '[{"my_var1":"valueA", "my_var2": "valueB"}]' | \ jq -r '.[] .my_var2' # 正确结果: valueB
但需求是必须用Bash变量指定要提取的字段后缀(变量值为var2),不能直接写my_var2。我尝试的写法无法得到预期结果:
$ PART="var2" $ echo '[{"my_var1":"valueA", "my_var2": "valueB"}]' | \ jq -r --arg JSONPART ${PART} '.[] .my_[$JSONPART]'
正确实现方式
核心是要在jq中将前缀my_和传入的变量拼接成完整的键名,再通过方括号语法访问。有两种可行写法:
写法一:字符串拼接
PART="var2" echo '[{"my_var1":"valueA", "my_var2": "valueB"}]' | \ jq -r --arg JSONPART "$PART" '.[] | .["my_" + $JSONPART]'
写法二:字符串插值
PART="var2" echo '[{"my_var1":"valueA", "my_var2": "valueB"}]' | \ jq -r --arg JSONPART "$PART" '.[] | .["my_\($JSONPART)"]'
两种写法都会输出预期结果:
valueB
错误原因说明
原写法.my_[$JSONPART]的问题在于,jq会将.my_解析为一个名为my_的字段,而非前缀,自然无法匹配到my_var2。必须通过字符串拼接生成完整的键名字符串,再用方括号的动态字段访问语法才能正确提取值。
内容的提问来源于stack exchange,提问作者pa-well
相关产品推荐
相关产品推荐

