在使用配置文件设置的BASH脚本中扩展日期

时间:2013-11-05 18:43:49

标签: bash

我接管了一个脚本,该脚本将数据库中的一些文件发送给客户。它有一个包含配置变量的.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命令等)。我已经看了一会儿,但似乎无法看出问题所在。

2 个答案:

答案 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')/" | ...