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

在用配置文件设置的BASH脚本中展开日期,bash,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" != ""

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

问题是配置文件只会被读取,而不会被执行

在配置文件中放置一个类似#MYDATE#的标记,并在从配置文件提取内容的管道中添加一个sed诅咒来替换它,大致如下所示:

 ... | sed -e "s/#MYDATE#/$(date +'%A %d %B %Y')/" | ...

问题是配置文件只会被读取,而不会被执行

在配置文件中放置一个类似#MYDATE#的标记,并在从配置文件提取内容的管道中添加一个sed诅咒来替换它,大致如下所示:

 ... | sed -e "s/#MYDATE#/$(date +'%A %d %B %Y')/" | ...

问题是配置文件只会被读取,而不会被执行

在配置文件中放置一个类似#MYDATE#的标记,并在从配置文件提取内容的管道中添加一个sed诅咒来替换它,大致如下所示:

 ... | sed -e "s/#MYDATE#/$(date +'%A %d %B %Y')/" | ...

问题是配置文件只会被读取,而不会被执行

在配置文件中放置一个类似#MYDATE#的标记,并在从配置文件提取内容的管道中添加一个sed诅咒来替换它,大致如下所示:

 ... | sed -e "s/#MYDATE#/$(date +'%A %d %B %Y')/" | ...

不要在文件中嵌入命令替换,只需放置一个
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

不要在文件中嵌入命令替换,只需放置一个
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

不要在文件中嵌入命令替换,只需放置一个
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

不要在文件中嵌入命令替换,只需放置一个
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

谢谢这要简单得多(而且有效!),但有一个小问题,当我用你的部分替换我的部分时,每个电子邮件附件都是空白的。当我将该部分切换回原始部分时,附件包含内容。我在该部分没有看到任何会影响附件内容的内容,是吗?我能提供更多的信息吗?中的
$maiu\u如何习惯于最终发送电子邮件?尝试的一件事(可能是毫无意义的)是在
printf
语句中添加一个新行,通过在
body
中捕获
awk
的输出来恢复丢失的新行(我也将在上面进行更改)。它实际上是
$MAIL\u in
(原始问题中的键入错误已经纠正)。我想你要找的那一行是| mailconv$MAILFILES | tee tg.MAIL |$SENDMAIL$SENDER-t
。即使修改了新行,附件仍然没有任何内容。当还原回脚本的该部分时,附件包含内容。还有其他想法吗?下面是Harald的答案。我更喜欢使用
printf
,但目前似乎无法使用。谢谢。这要简单得多(而且有效!),但有一个小问题,当我用你的部分替换我的部分时,每个电子邮件附件都是空白的。当我将该部分切换回原始部分时,附件包含内容。我在该部分没有看到任何会影响附件内容的内容,是吗?我能提供更多的信息吗?中的
$maiu\u如何习惯于最终发送电子邮件?尝试的一件事(可能是毫无意义的)是在
printf
语句中添加一个新行,通过在
body
中捕获
awk
的输出来恢复丢失的新行(我也将在上面进行更改)。它实际上是
$MAIL\u in
(原始问题中的键入错误已经纠正)。我想你要找的那一行是| mailconv$MAILFILES | tee tg.MAIL |$SENDMAIL$SENDER-t
。即使修改了新行,附件仍然没有任何内容。当还原回脚本的该部分时,附件包含内容。还有其他想法吗?下面是Harald的答案。我更喜欢使用
printf
,但目前似乎无法使用。谢谢。这要简单得多(而且有效!),但有一个小问题,当我用你的部分替换我的部分时,每个电子邮件附件都是空白的。当我将该部分切换回原始部分时,附件包含内容。我在该部分没有看到任何会影响附件内容的内容,是吗?我能提供更多的信息吗?中的
$maiu\u如何习惯于最终发送电子邮件?一件(可能是毫无意义的)尝试是在
printf
语句中添加一个换行符,通过在
body
中捕获
awk
的输出来恢复丢失的换行符(我也将在上面进行更改)。它实际上是
$MAIL_