Как создать многострочную строку с переменными, заключенными в одинарные и двойные кавычки? - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь отправить запрос в базу данных ElasticSearch с помощью команды curl, но у меня возникают трудности при построении строки с использованием сценариев bash.

Прежде всего, без каких-либо переменных, работает следующая команда успешно:

curl -XGET << "EOT" "stg-myserver.stg.xyz2.bdd.local:9200/stg_index-2020.03.10/_data?format=csv&fields_name=personId,totalPrice,regDatetime&_source=" -d '
{
  "query": { 
        "bool": {
            "filter": [{
              "range" : {
                          "regDatetime" : {
                              "gte" : "2020-03-11T08:00:00+09:00",
                              "lte" : "2020-03-11T08:59:59+09:00"
                          }
              }
            }]
        }
    }
}'
EOT

Однако при попытке подставить переменную для значений regDatetime запрос не выполняется.

START_TIME='2020-03-11T08:00:00+09:00'
END_TIME='2020-03-11T08:59:59+09:00'

curl -XGET << "EOT" "stg-myserver.stg.xyz2.bdd.local:9200/stg_index-2020.03.10/_data?format=csv&fields_name=personId,totalPrice,regDatetime&_source=" -d '
{
  "query": { 
        "bool": {
            "filter": [{
              "range" : {
                          "regDatetime" : {
                              "gte" : "$START_TIME",
                              "lte" : "$END_TIME"
                          }
              }
            }]
        }
    }
}'
EOT

После выполнения второго оператора я получаю следующую ошибку:

{"error": {"root_cause": [{"type": "parse_exception", "reason": "не удалось проанализировать поле даты [$ START_TIME] ...

Как я могу получить доступ к START_TIME и END_TIME?
Является ли использование heredo c разумным решением или кто-нибудь может порекомендовать менее подверженный ошибкам подход?

1 Ответ

1 голос
/ 12 марта 2020

Вам необходимо удалить двойную кавычку из ключевого слова EOT.

curl -XGET 'stg-myserver.stg.xyz2.bdd.local:9200/stg_index-2020.03.10/_data?format=csv&fields_name=personId,totalPrice,regDatetime&_source=' -d << EOT
{ 
   ...
}
EOT 

Как сказано в man bash:

Если слово без кавычек , все строки здесь-документа подвергаются расширению параметров (...)

Тем не менее, я советую использовать инструмент, который JSON знает, чтобы подделать вашу дату, как jq:

jq -c -n --arg s "$START_TIME" --arg e "$END_TIME" '{ query: { bool: { filter: [ { range: { regDateTime : { gte: $s, lte: $e } } } ] }}}'

Вставляет только время начала s и время окончания e в данные JSON. Преимущество состоит в том, что вы уверены, что данные верны JSON.

Это можно интегрировать с вашей командой следующим образом:

START_TIME='2020-03-11T08:00:00+09:00'
END_TIME='2020-03-11T08:59:59+09:00'
json_data=$(jq -c -n --arg s "$START_TIME" --arg e "$END_TIME" '{ query: { bool: { filter: [ { range: { regDateTime : { gte: $s, lte: $e } } } ] }}}')
url='stg-myserver.stg.xyz2.bdd.local:9200/stg_index-2020.03.10/_data?format=csv&fields_name=personId,totalPrice,regDatetime&_source='
curl -XGET "$url" -d "$json_data" 
...