使用jq读取存储在变量中含句点的JSON键失败如何解决
问题原因与解决方法
原因分析
两个错误分别由Shell引号解析逻辑和jq语法规则导致:
- 第一种写法
val=$(echo $json_data | jq .'$key'):Shell中单引号包裹的内容不会做变量解析,传递给jq的表达式是字面量.$key,既不符合jq语法规则,也无法读取Shell中定义的key变量值,因此直接抛出编译错误。 - 第二种写法
val=$(echo $json_data | jq ."$key"):Shell会先把双引号内的$key解析为spark.master,最终传递给jq的表达式是.spark.master。jq会把该表达式识别为先取顶层键spark,再取spark下的子键master,但原始JSON中不存在顶层键spark,因此返回null。
解决方法
最安全的方案是使用jq的--arg参数将Shell变量传入jq内部,再用通用的方括号索引语法取值,该方案不受键名特殊字符、注入风险影响:
key="spark.master" # --arg参数将Shell变量$key的值赋值给jq内部的变量k val=$(echo "$json_data" | jq --arg k "$key" '.[$k]') echo $val
运行后输出结果为"local",符合预期。
如果需要直接拼接Shell变量生成jq表达式,可以用如下写法(注意:键名包含双引号等特殊字符时可能出错,不推荐):
val=$(echo "$json_data" | jq ".[\"$key\"]")
内容的提问来源于stack exchange,提问作者Sunil Kumar B M
相关产品推荐
相关产品推荐

