我如何将 .sh 文件中的 shell 变量用于 elasticsearch curl POST

How do i use shell variables in .sh file for a elasticsearch curl POST

你好 Whosebug 社区

如果我 运行 这个 shell 脚本我希望它简单地在我的 elasticsearch 索引中添加一个条目 backup_timestamps.

在字段“时间戳”中应该是当前时间变量。在字段“system_name”中应该是机器的当前主机名变量。

#!/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")"

在 运行ning 这个 shell 脚本之后,我在 elasticsearch 数据库中得到的是:

{
    "_index" : "backup_timestamps",
    "_id" : "BybOdYABhPvBW1kMbwKh",
    "_score" : 1.0,
    "_source" : {
    "timestamp" : "$timestamp",
    "system_name" : "$system_name"
}

但我想得到的是:

{
    "_index" : "backup_timestamps",
    "_id" : "BybOdYABhPvBW1kMbwKh",
    "_score" : 1.0,
    "_source" : {
    "timestamp" : "2022-01-01 12:00:00",
    "system_name" : "my-server-or-whatever"
}

编辑1:

答案是这样的:

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\"}"

您的 JSON 包在单引号内。

单引号不允许变量替换,双引号可以:

$ THING=hello
$ echo "$THING"
hello
$ echo '$THING'
$THING

将您的数据包放在双引号中,看起来像这样:

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\"}"

另一种不混淆转义引号的方法,但仅适用于您示例中的简单字符串值(即 non-JSON 字符串、带文字引号、换行符、制表符等的字符串):

PAYLOAD_TEMPL='{
    "timestamp": "%s",
    "system_name": "%s"
}'

PAYLOAD=$(printf "${PAYLOAD_TEMPL}" "${timestamp}" "${system_name}")

sudo curl -u elastic:PASSWORD -XPOST "https://localhost:9200/backup_timestamps/_doc" --cacert ./certs/ca/ca.crt -H 'Content-Type: application/json' -d "$PAYLOAD"