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スクリプトを介して同じロジックを実行したいと思います。
バッシュスクリプト
REPO=repo.com
PASSWD=passworder
$JQ --arg repo "$REPO" --arg passwd "$PASSWD" '.auths.[$repo] += {"auth": $passwd}' .docker/config.json
ただし、これはtest.auth
to をオーバーライドし、キーrepo.com.auth
に追加しません。auths
Bashスクリプトを実行したときの結果は次のとおりです。
{
"auths": {
"repo.com": {
"auth": "passworder
}
}
}
古いオブジェクトを完全に上書きします。一般に、式に適用するにはどのパターンが必要ですかjq
?パラメータが一意でrepo
異なるtest
ため、これがbashスクリプトで機能しないrepo.com
のはなぜですか?+=
答え1
JQでは、キーを括弧内に入れる必要があります。
#!/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