使用JQ在Shell脚本中存储与更新JSON数据
解决Shell脚本中jq解析JSON的转义错误问题
核心问题
你的错误根源在于shell变量的未正确引用:当你用echo $UPDATED_JSON时,没有加双引号,shell会对JSON中的空格、转义字符、换行符等进行分词和格式破坏,导致jq收到的是损坏的JSON字符串,从而触发解析错误。
正确实现方案
方案1:直接操作文件(推荐)
避免将JSON存储在shell变量中,直接用jq处理文件并写入临时文件(防止原文件因jq执行失败损坏):
# 首次更新:设置leafNode为false(不存在则自动创建) jq '.topLevelObject.leafNode = false' ../some_file.json > temp.json && mv temp.json ../some_file.json # 后续交互更新示例:比如读取用户输入更新另一个节点 read -p "请输入新的节点值:" new_value jq --arg val "$new_value" '.topLevelObject.anotherNode = $val' ../some_file.json > temp.json && mv temp.json ../some_file.json
方案2:必须用变量存储时的正确写法
如果需要在多次jq操作之间执行shell逻辑,务必用双引号包裹所有变量引用,保证JSON结构完整:
# 正确读取JSON到变量(jq直接读文件,无需cat) UPDATED_JSON=$(jq . ../some_file.json) # 修改JSON时,用双引号包裹变量,避免shell破坏格式 UPDATED_JSON=$(echo "$UPDATED_JSON" | jq '.topLevelObject.leafNode = false') # 写回文件时同样用双引号 echo "$UPDATED_JSON" > ../some_file.json
关键注意事项
- 永远用双引号包裹包含JSON的shell变量,防止shell对JSON的特殊字符(如
\"、换行、空格)进行错误处理。 - jq本身支持直接读写文件,尽量避免将JSON存入shell变量,减少格式损坏风险。
.topLevelObject.leafNode = false的写法是正确的,无论leafNode是否存在,jq都会自动创建或覆盖该节点。
内容的提问来源于stack exchange,提问作者NonatomicRetain
相关产品推荐
相关产品推荐

