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

Bash将变量值写入JSON文件:jq命令使用报错求助

解决jq修改JSON字段的问题

你在使用jq修改JSON文件时踩了几个语法和选项的小坑,我来帮你梳理清楚并给出正确的操作方式:

先说说你原命令的问题

  • --arg $ja 语法错误:--arg后面应该直接跟变量名(不带$符号),比如--arg ja "bbbb",变量名是ja,后面才是对应的值
  • -n 选项用错了:这个选项是让jq不读取输入文件,而是从头构建新的JSON对象,所以你的命令根本没用到my.json里的原有内容
  • 你需要同时设置parent和project两个字段,原命令只处理了project,还得补充parent的修改逻辑

正确的jq命令写法

假设你要把parent设为aaaaa,project.key设为bbbb,正确的命令应该是这样的:

jq --arg parent_val "aaaaa" --arg project_key "bbbb" '.fields.parent.key = $parent_val | .fields.project.key = $project_key' my.json

简单解释下:

  • --arg parent_val "aaaaa":定义变量parent_val,对应值为aaaaa
  • --arg project_key "bbbb":定义变量project_key,对应值为bbbb
  • .fields.parent.key = $parent_val:修改JSON里fields.parent.key字段的值
  • |:管道符,把前一个操作的结果传给后一个操作,实现同时修改两个字段
  • 最后跟上输入文件my.json,这样jq才会读取并修改它的内容

如何直接覆盖原文件?

jq默认会把结果输出到控制台,如果想直接写回原文件,不要直接用> my.json(会先清空文件再写入,可能导致文件损坏),推荐两种安全的方法:

  1. 使用临时文件中转:
jq --arg parent_val "aaaaa" --arg project_key "bbbb" '.fields.parent.key = $parent_val | .fields.project.key = $project_key' my.json > temp.json && mv temp.json my.json
  1. 如果你安装了moreutils工具包,可以用sponge命令(它会先读取所有内容再写入,避免文件损坏):
jq --arg parent_val "aaaaa" --arg project_key "bbbb" '.fields.parent.key = $parent_val | .fields.project.key = $project_key' my.json | sponge my.json

验证修改结果

执行命令后,你可以直接查看my.json,或者用下面的命令快速检查特定字段:

jq '.fields.parent.key, .fields.project.key' my.json

正常情况下会输出:

"aaaaa"
"bbbb"

内容的提问来源于stack exchange,提问作者Milister

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:30:07