Jq
jq 覆蓋唯一鍵而不是添加到文件中的 JSON 對象
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 腳本中不起作用?
JQ 要求將密鑰放在括號中:
#!/bin/bash FILE=testfile.json REP=repo.com PWD=passworder cat $FILE | jq --arg repo "$REP" --arg pass "$PWD" '.auths += { ($repo) : {"auth": $pass}}'
與White Owl 的回答相比,使用稍微簡化的語法:
repo=repo.com auth=passworder jq --arg auth "$auth" --arg repo "$repo" '.auths[$repo] = { auth: $auth }' file
If
auth
是葉子對像中的唯一鍵,或者保證葉子對像不存在:repo=repo.com auth=passworder jq --arg auth "$auth" --arg repo "$repo" '.auths[$repo].auth = $auth' file