컬에 사용하기 위해 json의 bash var 교체

컬에 사용하기 위해 json의 bash var 교체

(myjson)팀, 컬 명령에 사용할 json의 값을 바꿀 수 없습니다 . 어떤 팁이 있나요?

JENKINS_USERNAME="svc-user"
JENKINS_USER_TOKEN="xxxx"
JENKINS_INSTANCE_FQDN="sham.blsm.comp.com"
INSTANCE="test-verify"
CREDENTIAL_ID_NAME="test"
USERNAME_KEY="tests"
USER_PASSWORD_KEY="testst"
ID_DESCRIPTION="asdfasdfasdf"
myjson=\''{ 
            "credentials": {
                "scope": "GLOBAL",
                "id": "'"${CREDENTIAL_ID_NAME}"'",
                "username": "'"${USERNAME_KEY}"'", 
                "password": "'"${USER_PASSWORD_KEY}"'",
                "description": "'"${ID_DESCRIPTION}"'",
                "\$class": "com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl"
            }
        }'\'
curl -X POST https://${JENKINS_USERNAME}:${JENKINS_USER_TOKEN}@${JENKINS_INSTANCE_FQDN}/${JENKINS_INSTANCE}/credentials/store/system/domain/_/createCredentials \
--data-urlencode ${myjson}

산출

curl -X POST https://${JENKINS_USERNAME}:${JENKINS_USER_TOKEN}@${JENKINS_INSTANCE_FQDN}/${JENKINS_INSTANCE}/credentials/store/system/domain/_/createCredentials \
--data-urlencode ${myjson}
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
curl: (3) URL using bad/illegal format or missing URL
curl: (3) unmatched brace in URL position 1:
{
 ^

아래 답변이 도움이 되지 않았습니다. JSON 문자열의 Bash 변수 대체

답변1

작은따옴표는 값의 일부가 아니라 명령줄의 일부입니다. 컬이 값을 얻기 전에 인용 확장에서 제거되므로 포함하지 마십시오.

myjson='{ 
            "credentials": {
                "scope": "GLOBAL",
                "id": "'"${CREDENTIAL_ID_NAME}"'",
                "username": "'"${USERNAME_KEY}"'", 
                "password": "'"${USER_PASSWORD_KEY}"'",
                "description": "'"${ID_DESCRIPTION}"'",
                "$class": "com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl"
            }
        }'

(달러 기호는 작은따옴표로 이스케이프할 필요가 없습니다.)

단어 분리를 방지하려면 변수를 큰따옴표로 묶어야 합니다.

curl -X POST https://${JENKINS_USERNAME}:${JENKINS_USER_TOKEN}@${JENKINS_INSTANCE_FQDN}/${JENKINS_INSTANCE}/credentials/store/system/domain/_/createCredentials \
--data-urlencode "${myjson}"

이는 변수에 큰따옴표가 포함되지 않은 경우에만 작동합니다. 더 복잡한 사례를 처리하려면 JSON 인식 도구를 사용하는 것이 더 좋습니다. 학습하는 것이 좋습니다..

답변2

쉘 변수 세트에서 JSON 문서를 생성하는 가장 안전한 방법은 를 사용하는 것입니다 jq. 이렇게 하면 필요할 때 각 문자열 값이 적절하게 인코딩됩니다(예: 비밀번호에 큰따옴표나 백슬래시 또는 인코딩해야 하는 다른 항목이 포함된 경우). JSON 문자).

payload=$(
    jq -n \
        --arg scope GLOBAL \
        --arg id "$CREDENTIAL_ID_NAME" \
        --arg username "$USERNAME_KEY" \
        --arg password "$USER_PASSWORD_KEY" \
        --arg description "$ID_DESCRIPTION" \
        --arg '$class' com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl \
        '{ credentials: $ARGS.named }'
)

$ARGS.named--arg모든 키 + 명령줄에 정의된 값을 포함하는 JSON 개체입니다(값이 이미 JSON 값으로 인코딩된 경우 사용됨 jq).--argjson

질문에 표시된 변수가 주어지면 payload다음 내용으로 쉘 변수가 생성됩니다( 보다 컴팩트한 출력을 생성하기 위해 옵션 jq과 함께 사용됨).-c

{
  "credentials": {
    "scope": "GLOBAL",
    "id": "test",
    "username": "tests",
    "password": "testst",
    "description": "asdfasdfasdf",
    "$class": "com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl"
  }
}

"""''\\\!!생성된 문자열과 보이지 않는 문자로 구성된 사용자 비밀번호의 경우 Ctrl+Gpassword값이 자동으로 JSON 문자열로 인코딩됩니다 \"\"\"''\\\\\\!!\u0007.

그런 다음 와 함께 사용할 수 있습니다 curl. 큰따옴표로 묶인 변수의 확장만 기억하세요.

관련 정보