如何创建多行卷曲字符串,并在单引号和双引号中包含变量?

问题描述 投票:0回答:1

我正在尝试使用curl命令将查询发送到ElasticSearch数据库,但在使用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

执行第二条语句后,出现以下错误:

{“错误”:{“ root_cause”:[{“类型”:“ parse_exception”,“原因”:“无法解析日期字段[$ START_TIME] ...

我如何访问START_TIME和END_TIME?使用Heredoc是合理的解决方案,还是有人可以推荐一种不太容易出错的方法?

bash elasticsearch curl heredoc
1个回答
0
投票

您需要从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中所述:

如果单词是unquoted,则此文档的所有行都将进行参数扩展(...)

也就是说,我建议使用JSON识别工具来伪造您的日期,例如jq

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

仅在JSON数据内插入开始时间s和结束时间e。好处是您可以确保数据是正确的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" 
© www.soinside.com 2019 - 2024. All rights reserved.