卷曲停止发布任何内容

卷曲停止发布任何内容

在下面的 dev-netpro.sh 脚本中,如果我的 $FWK (即 '8fwk3_dev 2fwk0_dev' - 最多可以有 9 个单词)和 $CON (在示例中是一系列数字:'72 43),'curl' 不会发布任何内容172 28021 8261 14015 325 24 524') 获取多个单词

[Expert@WAL-NEW-VSX-02:0]# cat dev-netpro.sh 
#!/bin/bash
while true; do
        FWK=$(top -b -n 1 | egrep 'fwk' |  awk '{print $9 $NF}')
        CON=$(vsx stat -l | egrep 'number' | awk '{print $3}')       
TIME=`date +"%T"` 
echo $HOSTNAME, $TIME, $FWK, $CON
echo '{"WAL-VSX-02": "['"$TIME"','"$FWK"','"$CON"']"}'
curl -ik -H "Accept: application/json" -H "Content-type: application/json" -d '{"WAL-VSX-02": "['"$TIME"','"$FWK"','"$CON"']"}' -X POST "https://10.199.107.11:8880/test"  
sleep 2 
done
[Expert@WAL-NEW-VSX-02:0]# 

请参阅下面的输出:

    [Expert@WAL-NEW-VSX-02:0]# ./dev-netpro.sh 
    WAL-NEW-VSX-02, 12:53:17, 8fwk3_dev 2fwk0_dev, 72 43 172 28021 8261 14015 325 24 524
    {"WAL-VSX-02": "[12:53:17,8fwk3_dev
    2fwk0_dev,72
    43
    172
    28021
    8261
    14015
    325
    24
524]"}

......没有什么

答案1

换行符来自于脚本开头运行的这两个命令。后

FWK=$(回显 $FWK|tr -d '\n') CON=$(回显 $CON|tr -d '\n')

有效 !非常感谢你的帮助

答案2

您需要在 JSON 对象内部的内容周围加上引号,并且需要引用整个字符串,以便变量内的空格在空格被视为单独的参数之后不会产生任何内容。

echo "{\"WAL-VSX-02\": [\"$TIME\",\"$FWK\",\"$CON\"]}"

之前的方式是,字符串的几个组件周围有(单)引号,但如果任何变量中有空格,那么 shell 会将其解析为单独的字符串。这样,整个内容就会被引用,因此 shell 会将其解析为一个字符串。

答案3

要在 JSON 文档中包含任意字符串,您需要将字符串正确编码为 JSON 字符串。最好使用理解 JSON 的实用程序来完成此操作,例如jq

#!/bin/bash

while true; do
    fwk=$( top -b -n 1 | awk '/fwk/ { print $9 $NF }' )
    con=$( vsx stat -l | awk '/number/ { print $3 }' )

    printf -v now '%(%T)T' -1

    jq -cn \
        '{ "WAL-VSX-02": $ARGS.positional }' \
        --args "$now" "$fwk" "$con" |
    curl --silent --show-error \
        --json @- 'https://10.199.107.11:8880/test'

    sleep 2
done

在上面的代码中,使用 .json 创建了一个 JSON 文档jq。该文档将包含一个带有 key 的 JSON 对象WAL-VSX-02。键的值将是一个数组,其元素是--args命令末尾列出的字符串。

JSON 对象通过管道传输到其中,curl并用 读取它--json @-

要查看每次迭代中发布的 JSON,请在和tee之间插入新的管道步骤。jqcurl

鉴于我在您的问题中可以看到的数据,这将生成并发布一个相当于以下内容的 JSON 文档

{
  "WAL-VSX-02": [
    "12:53:17",
    "8fwk3_dev\n2fwk0_dev",
    "72\n43\n172\n28021\n8261\n14015\n325\n24\n524"
  ]
}

-c(但是由于我们使用 的选项,所以在一行上jq。)

只需多一点努力,我们就可以将这些多行字符串作为单独的数组发布。只需使用稍微修改过的jq表达式即可在换行符上分割给定的字符串(除了第一个字符串):

jq -cn \
    '{ "WAL-VSX-02": ( $ARGS.positional | .[1:] |= map(split("\n")) ) }' \
    --args "$now" "$fwk" "$con"

这将产生相当于

{
   "WAL-VSX-02": [
      "12:53:17",
      [ "8fwk3_dev", "2fwk0_dev" ],
      [ "72", "43", "172", "28021", "8261", "14015", "325", "24", "524" ]
   ]
}

相关内容