![将变量中的相同数据放在自己的行上?](https://linux22.com/image/120448/%E5%B0%86%E5%8F%98%E9%87%8F%E4%B8%AD%E7%9A%84%E7%9B%B8%E5%90%8C%E6%95%B0%E6%8D%AE%E6%94%BE%E5%9C%A8%E8%87%AA%E5%B7%B1%E7%9A%84%E8%A1%8C%E4%B8%8A%EF%BC%9F.png)
我有一个脚本,将用于带有 Asterisk 电话系统的 FreePBX。我想知道我们的任何扩展程序/端点是否离线/不可用,我希望通过电子邮件发送该信息。
#!/bin/bash
email="[email protected]"
offlineExtensions=$(asterisk -rx 'pjsip show contacts' | grep -i "unavail")
if [ "$offlineExtensions" ]
then
echo $offlineExtensions | mail -s "Extensions Offline" $email
fi
我的电子邮件看起来像...
Contact: 7101/sip:7101@IP_ADDRESS:5060 d20a378e88 Unavail 55.829 Contact: 7770/sip:7770@IP_ADDRESS:5060 174a796f10 Unavail 12.275
我希望联系人信息位于单独的行上,而不是连接在一起。我在脚本中使用了下一行符号(\n),但它似乎不起作用。
有什么想法吗?
答案1
您的联系人被串联起来,因为您没有$offlineExtensions
在 中引用echo $offlineExtensions | ...
。该变量的换行符完好无损,但 shell 将其拆分为单词,然后将由空格分隔的单词连接起来。为了防止这种情况,您需要$offlineExtensions
用双引号引起来。出于同样的原因,引用也是一种良好的卫生习惯$email
(尽管在这种特殊情况下不引用它是无害的)。
脚本中潜伏的一个不相关的问题是您正在使用echo
打印内容未知的变量。如果$offlineExtensions
碰巧以破折号开头-
,echo
则将其作为一个选项。的某些实现允许您通过使用而不是仅仅echo
使用 来避免该问题,而其他实现则不允许。处理它的便携方法是使用而不是.echo --
echo
printf
echo
总结一下,将该echo ...
行替换为:
printf '%s\n' "$offlineExtensions" | mail -s 'Extensions Offline' "$email"
答案2
你应该尝试使用
pjsip show contact concise
但这无论如何都不是最好的选择。
最佳实践是解析 /var/log/asterisk/messages 或完整文件(可以设置为在某人无法访问/无法访问时记录)。
最佳实践是使用 nagios 或其他监控软件,而不是自己编写。
答案3
我的最终脚本有效。谢谢。
#!/bin/bash
email="[email protected]"
offlineExtensions=$(asterisk -rx 'pjsip show contacts' | grep -i "unavail")
if [ "$offlineExtensions" ]
then
printf "$offlineExtensions" | mail -s 'Extensions Offline' "$email"
fi