我想使用 bash 脚本运行备份,然后使用 ssmtp 向我发送电子邮件。我正在尝试制作一个通用脚本,可以在不同的 Linux 机器上重复使用。下面是脚本的片段,我使用 sed 将一些占位符文本替换为$HOSTNAME
变量$DATE
。由于某种原因,当它运行时,我收到了电子邮件,但它没有插入主机名和日期,而是删除了占位符。有人能指出我做错了什么吗?
这是我的脚本的部分内容:
sed -i -e "s/HNAME/$HOSTNAME/g" backup_notification
sed -i -e "s/DATETIME/$date/g" backup_notification
ssmtp [email protected] < backup_notification
这是通知的文本文件(HNAME
并且DATETIME
是我想要用系统变量信息替换的占位符):
To: [email protected]
From: [email protected]
Subject: Backup completed
This confirms that backup is completed for HNAME on DATETIME.
以下是电子邮件的正文(请注意,HNAME 和 DATETIME 占位符已被擦除或替换为 nil。):
-----Original Message-----
From: root [mailto:[email protected]]
Sent: Thursday, March 10, 2016 1:15 PM
To: Me
Subject: Backup completed
This confirms that the backup is completed for has been renewed on .
TIA 提供任何帮助:)!
答案1
默认情况下,$HOSTNAME 和 $DATE 未定义为变量。相反,使用 $(command) 将输出 (stdout) 插入到command
字符串中。
例如,在您的例子中,将 $HOSTNAME 替换为您想要使用$(hostname)
的$(date)
:
sed -i -e "s/HNAME/$(hostname)/g" backup_notification
sed -i -e "s/DATETIME/$(date)/g" backup_notification
此外,-i
正如@user568271指出的那样,sed 上的标志将编辑您的 backup_notification 模板。如果您不想要这样,您可能希望从中读取并使用管道进行编辑:
cat backup_notification | sed -e "s/HNAME/$(hostname)/g" | sed -e "s/DATETIME/$(date)/g" | ssmtp [email protected]
答案2
-i 开关不是要“就地编辑”您的消息模板文件吗?
在备份过程开始时,您是否需要备份通知中模板的未更改版本?
作为替代方法,您是否考虑过使用带有字符串的 echo,该字符串使用输入到 ssmtp 命令中的感兴趣的变量?
echo this confirms that backup has been completed and renewed for $HOSTNAME on $DATE | ssmtp [email protected]