将变量中的相同数据放在自己的行上?

将变量中的相同数据放在自己的行上?

我有一个脚本,将用于带有 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 --echoprintfecho

总结一下,将该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

相关内容