如何在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
相关产品推荐
相关产品推荐

