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