2017-01-24 14 views
0

ОС: Red Hat Enterprise Linux Server релиз 5,11 (Tikanga)Как создать динамический список параметров для команды mailx в bash linux?

У меня есть код sniplet:

!/usr/bin/env bash 

v_mailx_parameter="" 

v_cfg_email_adresse_to="[email protected]" 
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

Это подробно описано в [BashFAQ # 50] (http://mywiki.wooledge.org/BashFAQ/050). –

ответ

1

Вам нужно использовать массив, который может содержать все аргументы для легкого ведения журнала и вызова. Обратите внимание, однако, что перенаправление ввода для подачи сообщения на mailx составляет не аргумент.

#!/usr/bin/env bash 

v_cfg_email_adresse_to="[email protected]" 
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}" 
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[@]}" особенное в том, что она обеспечить каждый элемент отдельно в кавычках, без выполнения слов расщепления или расширений по фактической стоимости элементов (например, при использовании "[email protected]").

 Смежные вопросы

  • Нет связанных вопросов^_^