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

如何在jq读取JSON字符串时展开其中的Bash变量

在jq读取JSON时展开路径中的环境变量

我之前碰到过一模一样的问题:从JSON文件里读取带${variable}格式变量的路径字符串,用jq处理时,$writeFolder这类变量能正常展开,但${BUILD_FOLDER}却被当成字面量保留了——用set -x调试的时候一眼就能看出来这个问题。折腾了一阵后终于找到在jq读取阶段完成变量展开的可行方案,分享给大家:

示例JSON文件(比如命名为config.json)

假设你的JSON内容是这样的:

{
  "targetPath": "/path/to/${BUILD_FOLDER}/from/${writeFolder}"
}

解决后的jq命令

要让jq在读取时把这些变量替换成实际值,你可以结合jq的env对象访问系统环境变量,再用gsub函数做字符串替换:

# 针对单个变量精准替换的写法
jq --arg writeFolder "$writeFolder" '.targetPath | gsub("\\${BUILD_FOLDER}"; env.BUILD_FOLDER) | gsub("\\${writeFolder}"; $writeFolder)' config.json

如果你的路径里全是环境变量,还可以用更通用的正则匹配来批量替换:

# 通用替换所有大写+下划线格式的环境变量
jq '.targetPath | gsub("\\${([A-Z_]+)}"; env[.])' config.json

关键逻辑说明

  • 用gsub("\\${变量名}"; env.变量名)可以精准匹配${变量名}格式的字符串,直接替换为对应的系统环境变量值;
  • 如果是通过命令行传入的自定义变量(比如$writeFolder),需要用--arg参数把它传递给jq,再在替换时引用$writeFolder;
  • 通用正则\\${([A-Z_]+)}能匹配所有符合环境变量命名规则的变量,env[.]会自动取捕获组里的变量名对应的环境变量值。

用这个方法处理后,路径里的所有变量都会在jq读取阶段正确展开,再也不会出现字面量残留的情况了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:23:00