![变量在多行字符串赋值中无法解析](https://linux22.com/image/12264/%E5%8F%98%E9%87%8F%E5%9C%A8%E5%A4%9A%E8%A1%8C%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%B5%8B%E5%80%BC%E4%B8%AD%E6%97%A0%E6%B3%95%E8%A7%A3%E6%9E%90.png)
我正在尝试创建一个 shell 脚本,它提供一个进一步使用的 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"
) 处的此处文档分隔符周围添加了引号。由于此处文档已被引用,因此 shell 不会尝试扩展其中的任何变量或其他扩展。
要扩展TESTS
变量,请使用不带引号的此处文档。为了避免扩展类似的内容${Jenkins.jobStatus}
(在大多数 shell 中这将是一个语法错误,因为变量名称中不能有点),请$
对这些内容进行转义。
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"
...确保正确地双引号变量的扩展,以免在空格上分割其值,并避免在其中的单词上调用文件名通配。