JSON 文件
当前的
{
"auths": {
"test": {
"auth": "testserfdddd"
}
}
}
期望的
{
"auths": {
"test": {
"auth": "testserfdddd"
},
"myrepo.com" {
"auth": "passworder"
}
}
}
测试
作为命令行上的简单测试,我执行以下操作:
cat .docker/config.json | jq '.auths += {"myrepo.com": {"auth": "passworder"}}'
结果就是我想要的
{
"auths": {
"test": {
"auth": "testserfdddd"
},
"repo.com": {
"auth": "test"
}
}
}
不过我希望通过 bash 脚本执行相同的逻辑。
bash脚本
REPO=repo.com
PASSWD=passworder
$JQ --arg repo "$REPO" --arg passwd "$PASSWD" '.auths.[$repo] += {"auth": $passwd}' .docker/config.json
然而,这会覆盖test.auth
torepo.com.auth
并且不会添加到auths
密钥
运行 bash 脚本时的结果提供以下结果
{
"auths": {
"repo.com": {
"auth": "passworder
}
}
}
先前的对象被完全覆盖。我通常需要在表达式中适应什么模式jq
?由于参数repo
是唯一的(test
与不同repo.com
),为什么该+=
操作在 bash 脚本中不起作用?
答案1
JQ 要求将 key 放在括号中:
#!/bin/bash
FILE=testfile.json
REP=repo.com
PWD=passworder
cat $FILE | jq --arg repo "$REP" --arg pass "$PWD" '.auths += { ($repo) : {"auth": $pass}}'
答案2
与相比,使用稍微简化的语法白猫头鹰的回答:
repo=repo.com
auth=passworder
jq --arg auth "$auth" --arg repo "$repo" '.auths[$repo] = { auth: $auth }' file
如果auth
是叶对象中的唯一键,或者如果保证叶对象不存在:
repo=repo.com
auth=passworder
jq --arg auth "$auth" --arg repo "$repo" '.auths[$repo].auth = $auth' file