You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shell脚本中使用变量向Elasticsearch索引插入当前时间与主机名

Shell变量无法在curl请求中解析?看这两个解决方案!

你的问题出在Shell的引号规则上:当你用单引号' '包裹字符串时,Shell会把里面的内容完全当作字面量,不会解析任何变量(比如$timestamp和$system_name),所以它们直接被当成原始字符串存入了Elasticsearch。

下面是两种可行的修改方式:

方案1:转义双引号,用双引号包裹JSON数据

把原本包裹JSON的单引号改成双引号,同时转义JSON内部的双引号(避免Shell把它们当成字符串结束符):

#!/bin/sh
timestamp=`date +"%Y-%m-%d %T"`
system_name=`hostname`
sudo curl -u elastic:PASSWORD -XPOST "https://localhost:9200/backup_timestamps/_doc" --cacert ./certs/ca/ca.crt -H 'Content-Type: application/json' -d "{ \"timestamp\": \"$timestamp\", \"system_name\": \"$system_name\" }"
echo "("$timestamp" , "$system_name")"

方案2:使用Here-doc(推荐,更易读)

用Shell的Here-doc语法传递JSON数据,这样不需要转义双引号,代码结构更清晰:

#!/bin/sh
timestamp=$(date +"%Y-%m-%d %T")  # 推荐用$()代替反引号,可读性更强且支持嵌套
system_name=$(hostname)
sudo curl -u elastic:PASSWORD -XPOST "https://localhost:9200/backup_timestamps/_doc" --cacert ./certs/ca/ca.crt -H 'Content-Type: application/json' -d @- <<EOF
{
  "timestamp": "$timestamp",
  "system_name": "$system_name"
}
EOF
echo "($timestamp , $system_name)"

补充说明

  • $()和反引号`都能执行命令并获取输出,但$()的可读性更好,还支持命令嵌套,是更现代的写法。
  • Here-doc里的@-表示从标准输入读取数据,<<EOF到EOF之间的内容会作为输入传递给curl的-d参数,此时双引号里的变量会被Shell正常解析替换。

这样修改后,Elasticsearch就能接收到正确的时间戳和主机名了。

内容的提问来源于stack exchange,提问作者Issykul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:52:29