我如何将 .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"
你好 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"