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"
下面是我的 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"
前有一个未转义的白色spacemy_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"