bash - 如何创建多行 curl 字符串,变量包含在单引号和双引号中?

标签 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 '
{
  "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":"failed to parse date field [$START_TIME]...



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

最佳答案

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

If word is unquoted, all lines of the here-document are subjected to parameter expansion (...)



就是说,我建议您使用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" 

关于bash - 如何创建多行 curl 字符串,变量包含在单引号和双引号中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60654893/

相关文章:

regex - 在 grep 中匹配带有文字星号 "*"的行

bash - 空格分隔值;如何提供包含空格的值

elasticsearch - 使用为其他索引模式(相同数据)创建的Visualize Kibana?

elasticsearch - elasticsearch模板-从index_pattern创建别名

bash - Ubuntu为另一个用户设置脉冲音频接收器

linux - 添加-apt-存储库 ppa :ferramroberto/java how to add in a bash script

logging - Logstash 输入文件 - 从桌面文件读取

java - 具有非 key 对的 Android 发布请求

rest - 是否无法使用 curl、使用 Google Cloud Speech API 来识别 10 到 15 分钟内的文件?

r - 增加 R studio 的连接超时限制