在Bash脚本中用jq从环境变量名数组生成键值对JSON
解决方法
高效单jq调用方案
直接用jq的内置env对象和reduce函数,一次性生成目标JSON,无需多次调用jq或管道:
arr=('env_var1' 'env_var2' 'env_var3') jq -n 'reduce $ARGS.positional[] as $key ({}; .[$key] = env[$key])' --args "${arr[@]}"
方案说明
jq -n:从头构建新的JSON,不读取标准输入$ARGS.positional[]:接收--args传入的数组元素(即环境变量名)reduce:遍历每个变量名,初始值为空对象{},每次将env[$key](对应环境变量的实际值)赋值给JSON对象的$key键env[$key]:jq内置的环境变量对象,直接通过键名获取对应值
修正原管道方案(适合需要保留管道场景)
如果一定要用类似原方案的管道方式,可通过bash间接引用获取环境变量值,再传给jq:
arr=('env_var1' 'env_var2' 'env_var3') printf '%s\n' "${arr[@]}" | xargs -L1 -I{} jq -n --arg key {} --arg val "${!{}}" '{ ($key): $val }' | jq -s add
这里${!{}}是bash的间接引用语法,用于获取变量名为{}的环境变量的值。
原方案问题分析
原代码中jq -sR --arg key {} '{ ($key): . }'的.代表读取的标准输入内容(即变量名本身),而非该变量对应的环境变量值,所以生成的JSON值都是变量名而非实际值。
内容的提问来源于stack exchange,提问作者Somnath Pathak
相关产品推荐
相关产品推荐

