操作系统: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}"
谢谢!
答案 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}"