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

时间:2017-01-24 15:58:58

标签: bash parameters mailx

操作系统:Red Hat Enterprise Linux Server版本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}"

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您需要使用一个数组,它可以容纳所有参数以便于日志记录和调用。但请注意,将邮件提供给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}"