シェルスクリプトのjsonペイロードに変数を渡す

シェルスクリプトのjsonペイロードに変数を渡す

${MY_ENV_VAR}次のシナリオでは、ペイロードはどのように渡されますか?

私は脱出する必要があります:

a) ロードの一重引用符

textb) json フィールド値の二重引用符

${MY_ENV_VAR)もちろん補間する必要があります。

#!/bin/bash

COMMAND=${MY_ENV_VAR}    

curl -X POST --data-urlencode 'payload={"channel": "#alerts", "username": "k8s-cronjobs-bot", "text": "Command ${MY_ENV_VAR} run with success", "icon_emoji": ":ghost:"}' ${SLACK_WEBHOOK}

答え1

そしてjq

$ payload='{"channel": "#alerts", "username": "k8s-cronjobs-bot", "text": "", "icon_emoji": ":ghost:"}'
$ MY_ENV_VAR='"foo"'
$ echo "$payload" | jq --arg cmd "$MY_ENV_VAR" '.text = "Command " + $cmd + " run with success"'
{
  "channel": "#alerts",
  "username": "k8s-cronjobs-bot",
  "text": "Command \"foo\" run with success",
  "icon_emoji": ":ghost:"
}

したがって、スクリプトは次のようになります。

#!/bin/bash

COMMAND=${MY_ENV_VAR}    
payload='{"channel": "#alerts", "username": "k8s-cronjobs-bot", "text": "", "icon_emoji": ":ghost:"}'
payload=$(echo "$payload" | jq -r --arg cmd "$COMMAND" '.text = "Command " + $cmd + " run with success"')
curl -X POST --data-urlencode "payload=$payload"  "${SLACK_WEBHOOK}"

答え2

または、printf引用符を混在させるのに役立つ場合:

printf -v payload '{"channel": "#alerts", "username": "k8s-cronjobs-bot", "text": "Command %s run with success", "icon_emoji": ":ghost:"}' "$MY_ENV_VAR"
curl -X POST --data-urlencode "payload=$payload" "$SLACK_WEBHOOK"

関連情報