我正在尝试使用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是合理的解决方案,还是有人可以推荐一种不太容易出错的方法?
您需要从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"