变量在多行字符串赋值中无法解析

变量在多行字符串赋值中无法解析

我正在尝试创建一个 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"

...确保正确地双引号变量的扩展,以免在空格上分割其值,并避免在其中的单词上调用文件名通配。

相关内容