如何在jq中使用参数替换作为键
解决jq中用参数作为对象键的问题
当然可以实现这个需求,你需要使用jq的动态键语法——将变量包裹在方括号[]中,就能让变量的值作为对象的键名。
为什么你之前的写法不行?
- 直接写
$reg::jq的对象字面量默认键是固定字符串,直接用变量会触发语法错误。 - 写
"$reg":这会被当作字符串字面量处理,输出的键名就是$reg,不会替换成变量的实际值。 - 写
\$reg:转义后的符号依然是字符串,同样无法触发变量替换。
修改后的代码示例
export USERNAME=joe export PASSWORD=whatever export DOCKER_REGISTRY="hub.docker.io" jq -n --arg reg "${DOCKER_REGISTRY}" \ --arg u "$USERNAME" \ --arg p "${PASSWORD}" \ --arg auth "$(printf "%s" "$USERNAME:$PASSWORD" | base64)" \ '{ "auths": { [$reg]: { "username": $u, "password": $p, "auth": $auth } } }'
关键修改说明
把原来的$reg:改为[$reg]:,jq就会自动将$reg变量的取值(比如hub.docker.io)作为对象的键名,而不是把$reg当作字面量。
另外补充一个小优化:用printf "%s" "$USERNAME:$PASSWORD"代替echo生成base64内容,避免echo自动添加的换行符导致base64结果多出不必要的换行。
内容的提问来源于stack exchange,提问作者Christian Bongiorno
相关产品推荐
相关产品推荐

