在下面的 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
之间插入新的管道步骤。jq
curl
鉴于我在您的问题中可以看到的数据,这将生成并发布一个相当于以下内容的 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" ]
]
}