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