如何在 bash linux 中为 mailx 命令构建动态参数列表?

How can I build a dynamic parameter list for mailx command in bash linux?

OS:Red Hat Enterprise Linux 服务器版本 5.11 (Tikanga)

我有一个代码片段:

!/usr/bin/env bash

v_mailx_parameter=""

v_cfg_email_adresse_to="john.doe_to@gmail.com"
v_cfg_email_subject="Report from December 2016"
v_tmp_email_text_name="Message Body"

v_email_main_file="appel orange.txt" # -> There is a SPACE in the file name! 
v_tmp_path="/home/server/tmp/"

if [ ! -z "${v_email_main_file}" ]
 then v_mailx_parameter="${v_mailx_parameter} -a \"${v_tmp_path}${v_email_main_file}\""
                                                 /\
                                                 ||
         Here is the problem but I need this because of spaces in the name
fi

echo -e "/bin/mailx ${v_mailx_parameter} -s \"${v_cfg_email_subject}\" \"${v_cfg_email_adresse_to}\""

cat ${v_tmp_email_text_name} | /bin/mailx ${v_mailx_parameter} -s "${v_cfg_email_subject}" "${v_cfg_email_adresse_to}"

exit

问题: 我想动态地建立 mailx 命令的参数。

但我想使用 " 双引号,因为文件名中可以​​有空格。

不幸的是,上面的示例不起作用...因为 mailx 采用双引号,就好像它们属于文件名一样...我收到一条错误消息。

我不想使用 if else 条件..因为我有很多文件需要发送...我需要一个动态解决方案。

也许更好地理解我的问题是什么:

它以这种硬编码的方式工作:

cat ${v_tmp_email_text_name} | /bin/mailx -a "/home/server/tmp/appel orange.txt" -s "${v_cfg_email_subject}" "${v_cfg_email_adresse_to}"

但不是这样:

v_mailx_parameter="-a \"${v_tmp_path}${v_email_main_file}\""

cat ${v_tmp_email_text_name} | /bin/mailx ${v_mailx_parameter} -s "${v_cfg_email_subject}" "${v_cfg_email_adresse_to}"

谢谢!

一种简单的方法是使用数组。

declare -a parameters=()

parameters+=(-option1 OPTION VALUE)
parameters+=(-option2 "VALUE WITH SPACES")
parameters+=("/path/with spaces")
parameters+=("$PATH_WITH_SPACES")
if
  some_condition
then
  parameters+=(-optionA)
else
  parameters+=(-optionB)
fi
mailx "${parameters[@]}"

"${parameters[@]}" 扩展的特殊之处在于它确保每个元素都被单独引用,而不对元素的实际值执行分词或扩展(如使用 "$@" 时)。

您需要使用一个数组,它可以保存所有参数以便于记录和调用。但是请注意,将消息馈送到 mailx 的输入重定向 不是 参数。

#!/usr/bin/env bash

v_cfg_email_adresse_to="john.doe_to@gmail.com"
v_cfg_email_subject="Report from December 2016"
v_tmp_email_text_name="Message Body"

v_email_main_file="appel orange.txt"
v_tmp_path="/home/server/tmp/"

if [ ! -z "${v_email_main_file}" ]; then
  v_mailx_parameters+=( -a "${v_tmp_path}${v_email_main_file}" )
fi
v_mail_x_parameters+=( -s "${v_cfg_email_subject}" )
v_mail_x_parameters+=( "${v_cfg_email_adresse_to}" )

printf '/binmailx %s < %s\n' "${v_mail_x_parameters[*]}" "${v_tmp_email_text_name}"
/bin/mailx "${v_mailx_parameters[@]}" < "${v_tmp_email_text_name}"