0

我已经接管了一个脚本,该脚本将我们数据库中的一些文件发送给客户。它有一个.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命令等)。我已经看了一段时间,但似乎看不出问题出在哪里。

4

2 回答 2

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
于 2013-11-05T19:16:38.800 回答
1

问题是配置文件只被读取,但从未执行。

您将 #MYDATE# 之类的标记放入配置文件中,并在从配置文件中提取内容的管道之一中添加一个 sed 诅咒来替换它,大致沿线

 ... | sed -e "s/#MYDATE#/$(date +'%A %d %B %Y')/" | ...
于 2013-11-05T18:52:10.313 回答