我接管了一个脚本,该脚本将数据库中的一些文件发送给客户。它有一个包含配置变量的.cfg
文件和一个执行实际脚本的.cmd
文件。
例如在.cfg
文件中设置了电子邮件正文,即:
# --- EMAIL BODY BEGIN ---
# Please see attached report.
#
# Report generated on `date +"%A %d %B %Y"`
# --- EMAIL BODY END ---
提取此信息的.cmd
部分是:
if [ "$4" != "" ]
then
mail_body_begin=`cat $CFGFILE | grep -n "^# --- $4: EMAIL BODY BEGIN ---" |head -1 | cut -d: -f1`
mail_body_end=`cat $CFGFILE | grep -n "^# --- $4: EMAIL BODY END ---" | hea -1 | cut -d: -f1`
fi
if [ "$4" == "" -o "$mail_body_begin" == "" -o "$mail_body_end" == "" ]
then
mail_body_begin=`cat $CFGFILE | grep -n "^# --- EMAIL BODY BEGIN ---" | hea -1 | cut -d: -f1`
mail_body_end=`cat $CFGFILE | grep -n "^# --- EMAIL BODY END ---" | head -1| cut -d: -f1`
fi
mail_body_end=`expr $mail_body_end - 1`
mail_body_len=`expr $mail_body_end - $mail_body_begin`
cat $CFGFILE | head -$mail_body_end | tail -$mail_body_len | cut -c3- >> $MAIL_IN
我个人将date +"%A %d %B %Y"
添加到电子邮件正文中,但它不会被.cmd
自动展开(因此用户只看到date
命令等)。我已经看了一会儿,但似乎无法看出问题所在。
答案 0 :(得分:2)
不要在文件中嵌入命令替换,只需添加printf
格式字符:
# --- EMAIL BODY BEGIN ---
# Please see attached report.
#
# Report generated on %s
# --- EMAIL BODY END ---
然后使用printf
在提取模板后对其进行处理。脚本本身
可以使用awk
大大简化。
# The regular expressions that will match the template markers,
# taking into account $4 being set or not.
begin_marker="^# --- ${4:+$4: }EMAIL BODY BEGIN ---"
end_marker="^# --- ${4:+$4: }EMAIL BODY END ---"
body=$(awk -v b="$begin_marker" \
-v e="$end_marker" \
' $0 ~ e {selected=0};
selected {sub("# *", "", $0); print};
$0 ~ b {selected=1}' "$CFGFILE")
printf "$body\n" "$(date +"%A %d %B %Y")" >> $MAI_IN
答案 1 :(得分:1)
问题是配置文件只能被读取,但从未执行过。
你把像#MYDATE#这样的标记放入配置文件中,并在其中一个从配置文件中提取东西的管道中添加一个sed诅咒来替换它,大致沿着
行。 ... | sed -e "s/#MYDATE#/$(date +'%A %d %B %Y')/" | ...