複数行文字列の割り当てでは変数を確認できません。

複数行文字列の割り当てでは変数を確認できません。

追加の使用のために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"

...変数の値がスペースに分割されるのを防ぎ、変数内の単語に対してファイル名のグロービングを呼び出すのを防ぐには、変数の拡張子を二重引用符で正しく囲む必要があります。

おすすめ記事