Вот еще один подход, который вы можете использовать, используя 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
В вашем скрипте пара расширений переменных не заключена в кавычки:
"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-адреса для подключения к (. Я не могу воспроизвести точную ошибку, которую вы показать, хотя ).
См. также:Почему мой сценарий оболочки забивается пробелами или другими специальными символами?
Я проигнорирую возможные проблемы с цитированием и перепишу ваш скрипт с помощью инструмента построения 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
больше не нужна в скрипте.