【问题标题】:Bash script requires parameterBash 脚本需要参数
【发布时间】:2020-08-31 00:49:33
【问题描述】:

下面是我的 bash 脚本。

#!/bin/bash
message=$1
hostname=$2
severity=$3
eventname=$4
tagpath=$5
appname=$6
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 运行时

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 必须按此顺序发送,才能在端点中被接受。帮我纠正一下。

【问题讨论】:

  • 我推荐使用像jq这样的工具来生成有效的JSON,而不是依靠参数扩展来做到这一点。

标签: linux bash curl sh


【解决方案1】:

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

#!/bin/bash

parameters=(
  --arg message "$1"
  --arg hostname "$2"
  --arg severity "$3"
  --arg eventname "$4"
  --arg tagpath "$5"
  --arg appname "$6"
)

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"

【讨论】:

    【解决方案2】:

    假设:

    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”之前有一个未转义的空格

    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 数据结构中消失。

    【讨论】:

    • 这对我不起作用,我也意识到在 "summary":"my_message"} 之后有一个额外的 },我更正了它并提供了 "'$message'"。 @皮埃尔
    • 可能还有更多错误,但我的回答至少修复了一个。
    • 我删除了连接的部分,然后它似乎工作了。这是在 bash 中连接多个字段的唯一方法吗?
    • 我认为"message": "my_message" "my_event" "my_path" 是错误的。该值应该只有一个字符串而不是三个。我也将其更正为"message": "my_message my_event my_path"
    • 好的,如果我想将它们连接起来,我该怎么做?只是好奇@Pierre
    猜你喜欢
    • 2018-11-12
    • 1970-01-01
    • 2015-07-29
    • 2017-07-12
    • 2021-03-05
    • 2011-04-27
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多