curl 发送带引号的字符串变量

今天遇到一个问题,场景是这样的:我想在程序异常退出之后,将最后一行日志通过curl发送到报警服务器,我的脚本是这么写的:

log=$(tail -n 1 server.log)
curl -X POST -H "Content-Type: application/json" -d "{\"text\":\"退出前日志:$(echo $log)\"}"  https://xxx.xxx.xxx

而我的日志一般是长这样的:

log info 00:00:00 "event":"payment"

json里替换变量时,会直接将字符串变量替换进去,也就是说,这条命令实际执行的是这个:

log=$(tail -n 1 server.log)
curl -X POST -H "Content-Type: application/json" -d "{\"text\":\"退出前日志:log info 00:00:00 "event":"payment"\"}"  https://xxx.xxx.xxx

这时问题来了,字符串里有引号,且没有转义,所以json的内容实际到这里就停了:

"{\"text\":\"退出前日志:log info 00:00:00 "

这样一个json发给server,server肯定是拒绝的。。。

那么这个问题该怎么解决呢,其实只需要将字符串变量中的引号转义一下就好了,也就是这样:

" -> \"

所以我们要做的就是,把这个字符串变量中所有的引号替换掉就好了,说到替换,那自然就想到了sed,是的,就是用sed,话不多说,直接上修改后的脚本:

log=$(tail -n 1 server.log | sed 's/"/\\"/g')

是的,只需要这样一改,发出去就欧克了,简单吧,哈哈~

你可能感兴趣的:(Linux,shell)