(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+G키 password
값이 자동으로 JSON 문자열로 인코딩됩니다 \"\"\"''\\\\\\!!\u0007
.
그런 다음 와 함께 사용할 수 있습니다 curl
. 큰따옴표로 묶인 변수의 확장만 기억하세요.