追加の使用のために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で解析されないことです。そのまま印刷されます。
私はシェルに初めて触れました。助けてください。
答え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"
...変数の値がスペースに分割されるのを防ぎ、変数内の単語に対してファイル名のグロービングを呼び出すのを防ぐには、変数の拡張子を二重引用符で正しく囲む必要があります。