추가 사용을 위해 Json 청크를 제공하는 셸 스크립트를 만들려고 합니다. Json 청크는 변수로 할당된 동적 구성 요소로 구성됩니다. 아래는 코드 조각입니다.
failCount=$(cat jenkinstestResults.xml | grep -oP '(?<=failCount>)[^<]+')
skipCount=$(cat jenkinstestResults.xml | grep -oP '(?<=skipCount>)[^<]+')
echo $failCount
echo $passCount
echo $skipCount
TESTS=("$passCount" "$failCount" "$skipCount")
IFS='' read -r -d '' jsonBlock <<"EOF"
,{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*${Jenkins.jobStatus}*\n*Jenkins Job:* <${Jenkins.buildUrl}|${Jenkins.buildFullDisplayName}[#${Jenkins.buildNumber}])>*"
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Test Status:*\nPassed: ${TESTS[0]},Failed: ${TESTS[1]}, Skipped: ${TESTS[2]}"
}
]
}"
EOF
echo $jsonBlock
개발 환경에서는 Jenkins 변수가 올바르게 확인됩니다. 그러나 문제는 XML에서 값을 추출하는 TEST 변수가 최종 jsonBlock에서 구문 분석되지 않는다는 것입니다. 그대로 인쇄됩니다.
저는 Shell을 처음 접했습니다. 도와주세요.
답변1
여기에서 참조된 문서를 jsonBlock
변수로 읽어옵니다. 여기 문서가 인용된 이유는 <<"EOF"
문서 시작 부분( )에 따옴표를 추가했기 때문입니다. 문서가 여기에서 참조되기 때문에 쉘은 거기에서 변수나 기타 확장을 확장하려고 시도하지 않습니다.
변수를 확장하려면 TESTS
여기 문서를 따옴표 없이 사용하세요. 이와 같은 확장을 방지하려면 ${Jenkins.jobStatus}
(변수 이름에 점을 사용할 수 없기 때문에 대부분의 셸에서 구문 오류가 발생함) $
이를 이스케이프 처리하세요.
json=$( cat <<END_JSON
,
{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*\${Jenkins.jobStatus}*\n*Jenkins Job:* <\${Jenkins.buildUrl}|\${Jenkins.buildFullDisplayName}[#\${Jenkins.buildNumber}])>*"
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Test Status:*\nPassed: ${TESTS[0]},Failed: ${TESTS[1]}, Skipped: ${TESTS[2]}"
}
]
}
END_JSON
)
단순화를 위해 cat
여기서도 이를 사용합니다.
변수에서 이 텍스트 세그먼트를 출력하려면 json
다음을 사용하십시오.
printf '%s\n' "$json"
...변수 값이 공백으로 분할되는 것을 방지하고 변수 내의 단어에 대해 파일 이름 글로빙을 호출하는 것을 방지하려면 변수 확장을 큰따옴표로 올바르게 묶어야 합니다.