Bash 脚本需要参数

Bash script requires parameter

下面是我的 bash 脚本。

#!/bin/bash
message=
hostname=
severity=
eventname=
tagpath=
appname=
data="{"action":"EventsRouter","method":"add_event","data":[{"summary":"$message"},"device":"$hostname","message": "$message $eventname $tagpath","component":"$appname","severity":"$severity","evclasskey":"nxlog","evclass":"/nxlog/perf","monitor":"localhost"}],"type":"rpc","tid":1}"

echo "Total number of args : $#"

echo "message = $message"
echo "hostname = $hostname"
echo "appname = $appname"
echo "data = $data"

curl -u uname:password -k https://myurlcom/zport/dmd/evconsole_router -d $data

当我尝试 运行 与 sh tcp.sh value value value value value value

host:
'host,component:host,severity:host,evclasskey:nxlog,evclass:/nxlog/perf,monitor:localhost}],type:rpc,tid:1}'
is not a legal name (unexpected end of input) Total number of args : 6
message = message hostname = test appname = host data = curl: option
-d: requires parameter

我看到数据没有包含值。 此 json 必须按此顺序发送才能在端点中被接受。帮我纠正一下。

假设:

message="my_message"
hostname="my_host"
severity="my_severity"
eventname="my_event"
tagpath="my_path"
appname="my_app"

如果你运行:

data="{"action":"EventsRouter","method":"add_event","data":[{"summary":"$message"},"device":"$hostname","message": "$message $eventname $tagpath","component":"$appname","severity":"$severity","evclasskey":"nxlog","evclass":"/nxlog/perf","monitor":"localhost"}],"type":"rpc","tid":1}"

会报错,因为字符串"my_event"

前有一个未转义的白色space
my_event: command not found

发生了什么事?由于您的 json 输入在双引号之间有很多单词,因此您必须将整个字符串括在单引号中,以保留字符串内的双引号。但是在单引号之间,bash 变量不会被它们的值替换。因此,您需要关闭每个变量之前的单引号,然后立即重新打开它们。

因此您的脚本行必须变为:

data='{"action":"EventsRouter","method":"add_event","data":[{"summary":"'$message'"},"device":"'$hostname'","message": "'$message $eventname $tagpath'","component":"'$appname'","severity":"'$severity'","evclasskey":"nxlog","evclass":"/nxlog/perf","monitor":"localhost"}],"type":"rpc","tid":1}'

如果你执行:

echo "$data"

您将获得:

{"action":"EventsRouter","method":"add_event","data":[{"summary":"my_message"},"device":"my_host","message": "my_message my_event my_path","component":"my_app","severity":"my_severity","evclasskey":"nxlog","evclass":"/nxlog/perf","monitor":"localhost"}],"type":"rpc","tid":1}

这是正确的,我假设:双引号并没有从您的 json 数据结构中消失。

使用jq安全生成所需的JSON:

#!/bin/bash

parameters=(
  --arg message ""
  --arg hostname ""
  --arg severity ""
  --arg eventname ""
  --arg tagpath ""
  --arg appname ""
)

data=$(jq -n "${parameters[@]}" '
  {action: "EventsRouter",
   method: "add_event",
   data: [ {summary: $message, 
            device: $hostname,
            message: "\($message) \($eventname\) \($tagpath)",   
            component: $appname,
            severity: $severity,
            evclasskey: "nxlog",
            evclass: "/nxlog/perf",
            monitor: "localhost"
            }
          ],
   type: "rpc",
   tid: 1
  }'


curl -u uname:password -k https://myurlcom/zport/dmd/evconsole_router -d "$data"