【发布时间】:2020-01-04 04:51:33
【问题描述】:
我正在使用以下脚本从逗号分隔值生成 json 数据以提供给 zabbix。 但我得到了一个额外的逗号符号。请尽量优化最后一行的逗号。
#/bin/bash
IFS=':, ' read -r -a array <<< "$1"
idx=0
echo {\"data\":[
while [ -n "${array[$idx]}" ]; do
echo -n \{\"{#R_IP}\":\""${array[$idx]}"\"}
let idx=$idx+1
[ -n "$array[idx]}" ] && echo "," || echo
done
echo ]}
exit
输入
./test.sh embimsrv.exe,emcms.exe,emcmsg.exe,emforecastsrv.exe,emgtw.exe,emguisrv.exe,emmaintag.exe,emselfservicesrv.exe,Naming_Service.exe,p_ctmce.exe,p_ctmcs.exe,p_ctmrt.exe,p_ctmtr.exe,p_ctmwd.exe
输出
{"data":[
{"{#R_IP}":"embimsrv.exe"},
{"{#R_IP}":"emcms.exe"},
{"{#R_IP}":"emcmsg.exe"},
{"{#R_IP}":"emforecastsrv.exe"},
{"{#R_IP}":"emgtw.exe"},
{"{#R_IP}":"emguisrv.exe"},
{"{#R_IP}":"emmaintag.exe"},
{"{#R_IP}":"emselfservicesrv.exe"},
{"{#R_IP}":"Naming_Service.exe"},
{"{#R_IP}":"p_ctmce.exe"},
{"{#R_IP}":"p_ctmcs.exe"},
{"{#R_IP}":"p_ctmrt.exe"},
{"{#R_IP}":"p_ctmtr.exe"},
{"{#R_IP}":"p_ctmwd.exe"},
]}
【问题讨论】:
-
逗号分隔确实是错误的做法。 shell(由用户调用您的脚本运行的,而不是运行脚本本身的)在空格上拆分命令行参数,遵守其引用规则;当你传递一个逗号分隔的列表时,这不会阻止 shell 先进行自己的拆分和其他处理。
-
...手工生成 JSON,也是错误的做法;你有比缺少的逗号更多的错误。使用真正的 JSON 生成工具/库,您的代码不会在您注入带有需要转义才能在 JSON 字符串中有效的字符的数据时中断。