You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 10:06:13