elasticsearch,curl,heredoc,Bash,elasticsearch,Curl,Heredoc" /> elasticsearch,curl,heredoc,Bash,elasticsearch,Curl,Heredoc" />

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

Bash 如何创建多行卷曲字符串,变量包含在单引号和双引号中?,bash,elasticsearch,curl,heredoc,Bash,elasticsearch,Curl,Heredoc,我正在尝试使用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 '

我正在尝试使用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

curl-XGET您需要从
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 
这仅在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" 

谢谢你的建议。是的,理想情况下,我将能够使用jq-但不幸的是,我没有权限在需要的时间内将其安装到机器上。此外,我尝试从EOT中删除双引号,但仍然得到相同的“未能解析日期字段[$START\u TIME]”错误。我忘了提及它,但您必须在
-d
之后删除数据周围的单引号。为什么要使用here文档(the

jq -c -n --arg s "$START_TIME" --arg e "$END_TIME" '{ query: { bool: { filter: [ { range: { regDateTime : { gte: $s, lte: $e } } } ] }}}'
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"