如何在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
相关产品推荐
相关产品推荐

