在 BASH 脚本中使用 sed:用系统变量中的信息替换文本(主机名和日期)

在 BASH 脚本中使用 sed:用系统变量中的信息替换文本(主机名和日期)

我想使用 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]

相关内容