Передать значение переменной в curl JSON

Вот еще один подход, который вы можете использовать, используя printfи нарезая массив:

for f in hes*; do printf '%s\n' "${f[@]:3:-2}"; done

Также с использованием PE:

for f in hes*; do tmp="${f%.c}"; printf '%s\n' "${tmp:3}"; done
1
05.05.2021, 18:29
2 ответа

В вашем скрипте пара расширений переменных не заключена в кавычки:

 "key": "'$JIRA_PROJECT'"

и

 "customfield_13334": { "value": "'$TODAY_DATE'" },

Эти две строки должны быть соответственно:

"key": "'"$JIRA_PROJECT"'"

и

"customfield_13334": { "value": "'"$TODAY_DATE"'" },

Кроме того, вы также можете написать TODAY_DATE="${DATE_1}:${DATE_2} ${DATE_3}", сохранив ненужную подстановку команд / echo. Или, лучше, TODAY_DATE=$(date +"%d/%b/%y %I:%M %p"), устраняя необходимость в переменных DATE_n.

Расширение $TODAY_DATEвключает символы пробела:

$ DATE_1=`date +"%d/%b/%y %r" | cut -d":" -f1`
$ DATE_2=`date +"%d/%b/%y %r" | cut -d":" -f2`
$ DATE_3=`date +"%d/%b/%y %r" | cut -d":" -f3 | cut -d" " -f2`
$ TODAY_DATE=`echo "${DATE_1}:${DATE_2} ${DATE_3}"`
$ printf '%s\n' "$TODAY_DATE"
05/May/21 10:06 PM

Скорее всего, это означает, что аргумент опции --dataв вашем скрипте заканчивается первым словом значения TODAY_DATE. Следующее слово(10:06в этом случае )анализируется curlв качестве первого аргумента параметра, отличного от -, и, следовательно, принимается в качестве URL-адреса для подключения к (. Я не могу воспроизвести точную ошибку, которую вы показать, хотя ).

См. также:Почему мой сценарий оболочки забивается пробелами или другими специальными символами?

0
28.07.2021, 11:34

Я проигнорирую возможные проблемы с цитированием и перепишу ваш скрипт с помощью инструмента построения JSON jo.

#!/bin/sh

jira_creds='XXX:YYY'
jira_project='OPS'
jira_url='http://jira/jira/rest/api/2/issue/'
jira_content_type='Content-Type: application/json'

now=$( date +'%d/%b/%y %l:%M %p' )

json_data=$( jo -d. \
        fields.project.key="$jira_project" \
        fields.summary='Security patch update' \
        fields.description='The instances need to be updated via yum.' \
        fields.customfield_13339.value='Bamboo' \
        fields.customfield_13338.value='Approved' \
        fields.customfield_13337="$( jo -a "$( jo value='Team' )" )" \
        fields.customfield_13331="$( jo -a "$( jo value='SITTR' )" )" \
        fields.customfield_13334.value="$now" \
        fields.issuetype.name='Tech Task'
)

curl \
        -u "$jira_creds" \
        -X POST --data "$json_data" \
        -H "$jira_content_type" \
        "$jira_url"

Значением $json_dataбудет правильно отформатированный документ JSON, в котором все включенные переменные данные были закодированы JSON -, если это необходимо. Красиво напечатано -, может выглядеть примерно так

{
  "fields": {
    "project": {
      "key": "OPS"
    },
    "summary": "Security patch update",
    "description": "The instances need to be updated via yum.",
    "customfield_13339": {
      "value": "Bamboo"
    },
    "customfield_13338": {
      "value": "Approved"
    },
    "customfield_13337": [
      {
        "value": "Team"
      }
    ],
    "customfield_13331": [
      {
        "value": "SITTR"
      }
    ],
    "customfield_13334": {
      "value": "05/May/21 11:32 PM"
    },
    "issuetype": {
      "name": "Tech Task"
    }
  }
}

Альтернативный способ создания полезных данных JSON — начать со статического документа YAML (, который легко написать ), а затем вставить в него переменные данные с помощью yqизhttps://kislyuk.github.io/yq/

json_data=$( yq \
        --arg proj "$jira_project" \
        '.fields.project.key |= $proj |
        .fields.customfield_13334.value |=
                (now|strflocaltime("%d/%b/%y %l:%M %p"))' <<'END_YAML'
fields:
  summary: Security patch update
  description: The instances need to be updated via yum.
  customfield_13339:
    value: Bamboo
  customfield_13338:
    value: Approved
  customfield_13337:
    - value: Team
  customfield_13331:
    - value: SITTR
  issuetype:
    name: Tech Task
END_YAML
)

Обратите внимание, что здесь мы позволяем yqвычислять метку времени, поэтому переменная оболочки $nowбольше не нужна в скрипте.

1
28.07.2021, 11:34

Теги

Похожие вопросы