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

如何在Bash脚本中使用JQ通过变量修改JSON文件?

问题根源
  • 你使用单引号包裹jq的筛选表达式,Bash不会解析单引号内部的$var变量,因此jq拿到的是字面量"$var",而非你定义的变量值
  • 直接使用>重定向回原文件cdk.json存在逻辑问题:Bash会优先执行重定向操作清空文件,再运行jq命令,最终大概率得到空文件
  • 第二种写法额外嵌套了反引号和$(),相当于把jq的输出结果又当作命令执行一遍,完全不符合需求
正确写法

方法1:通过jq的--arg参数传递变量(最稳妥,无转义风险)

这是官方推荐的变量传递方式,完全避免引号嵌套、特殊字符转义的问题:

var="test-54342"
# 先写入临时文件再替换原文件,兼容所有jq版本
jq --arg new_val "$var" '.context["customer-name"] = $new_val' cdk.json > tmp.json && mv tmp.json cdk.json

如果你使用的是jq 1.6及以上版本,可以直接用-i参数原地修改文件,不用手动处理临时文件:

var="test-54342"
jq --arg new_val "$var" -i '.context["customer-name"] = $new_val' cdk.json

方法2:双引号包裹jq表达式实现变量展开(不推荐,容易出现转义问题)

如果你一定要通过Bash直接展开变量,需要把jq表达式放在双引号内,同时转义内部的双引号:

var="test-54342"
jq ".context[\"customer-name\"] = \"$var\"" cdk.json > tmp.json && mv tmp.json cdk.json

内容的提问来源于stack exchange,提问作者Sébastien Serre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:45:07