2017-01-24 36 views
0

OS:bash linuxでmailxコマンドの動的パラメータリストを作成するにはどうしたらいいですか?

!/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コマンドにパラメータを構築したいのRed Hat Enterprise Linux Serverは(Tikanga)

を5.11をリリース私は、コードsnipletを持っています。

しかし、私は、ファイル名にスペースが存在する可能性があるため、「二重引用符を使用します。

残念ながら、上記の例では動作しません...彼らは属しているかのように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

簡単な方法の1つは、配列を使用することです。それは("[email protected]"を使用する場合のような)の要素の実際の値に単語分割または拡張を行うことなく、要素のそれぞれが別々に引用されていることを確認することで

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[@]}"

膨張は特別です。

関連する問題