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(会先清空文件再写入,可能导致文件损坏),推荐两种安全的方法:
- 使用临时文件中转:
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
- 如果你安装了
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
相关产品推荐
相关产品推荐

