2017-04-13 10 views
0

私は電子メールレポートを送信するための次のbashスクリプトを用意しています。私はbashのmailコマンドで正しく動作するようにしようとしており、evalを使用する必要がある変数置換条件を使用したい。bash変数を一重引用符で置換しない

#!/bin/bash 

LOG="/tmp/error.txt" 
echo "test" > $LOG 

INCLUDED="aaaaaaaaaaaaaaaaa" 
EXCLUDED="bbbbbbbbbbbbbbbbb" 
STR=INCLUDED 

BODY=" 
Email Body: 
\${!STR}" 

#Set STR based on some condition 
STR=EXCLUDED     # set conditional with if statement 

SUB="email subject" 
PARAMS="-r \" Sender <[email protected]>\"" 
PARAMS+=" -s \"$SUB\"" 
PARAMS+=" -A $LOG"    # use conditional with if statement 

eval echo \"MESSAGE: "${BODY}"\" | mail $(eval echo ${PARAMS}) "[email protected]" 

以下のコードを実行している間、私は、diffのオプションを認識しませんmailコマンドへの入力として文字列の前後に引用符なしで$ PARAMS出力を渡す必要があります。私が得ることができる最も近いものは$(eval echo $PARAMS)という呼出しを使用していますが、これは被験者の周りの二重引用符を取り除くので、被験者にガーベルを与えます。

+ LOG=/tmp/error.txt 
+ echo test 
+ INCLUDED=aaaaaaaaaaaaaaaaa 
+ EXCLUDED=bbbbbbbbbbbbbbbbb 
+ STR=INCLUDED 
+ BODY=' 
Email Body: 
${!STR}' 
+ STR=EXCLUDED 
+ SUB='email subject' 
+ PARAMS='-r " Sender <[email protected]>"' 
+ PARAMS+=' -s "email subject"' 
+ PARAMS+=' -A /tmp/error.txt' 
+ eval echo '"MESSAGE:' ' 
Email Body: 
${!STR}"' 
++ echo 'MESSAGE: 
Email Body: 
bbbbbbbbbbbbbbbbb' 
++ eval echo -r '"' Sender '<[email protected]>"' -s '$SUB' -A /tmp/error.txt 
+++ echo -r ' Sender <[email protected]>' -s email subject -A /tmp/error.txt 
+ mail -r Sender '<[email protected]>' -s email subject -A /tmp/error.txt [email protected] 

はどのように引用符で囲まれた文字列として対象(-s)を通過して、私はメールコマンドに$ PARAMSを渡すのですか?

答えて

0

代わりに配列を使用し、各文字列を配列要素に配置します。

params=('-r') 
params=("${params[@]}" ' Sender <[email protected]>') 

mail "${params[@]}" 

それとも単純

params=('-r') 
params+=(' Sender <[email protected]>') 

mail "${params[@]}" 

こちらをご覧ください:Bash: add value to array without specifying a key

アップデートを、私はあなたには、いくつかの基本的なシェルプログラミングの知識が不足していると思うので。

  1. evalを使用しないでください!評価を遅らせる必要がある場合は、評価を行う関数を呼び出して呼び出します。
  2. 静的文字列には一重引用符を使用し、変数を含む文字列には二重引用符を使用します。
  3. 配列が必要な場合は、配列を使用します。
  4. コマンドをグループ化する必要がある場合は、中括弧でグループコマンドをグループ化します。

これは、上記のルールに従って更新された例です。

LOG=/tmp/error.txt 
echo 'test' > $LOG 

INCLUDED='aaaaaaaaaaaaaaaaa' 
EXCLUDED='bbbbbbbbbbbbbbbbb' 
STR=INCLUDED 

body() { echo " 
Email Body: 
$STR" 
} 

#Set STR based on some condition 
STR=EXCLUDED     # set conditional with if statement 

SUB='email subject' 
PARAMS=('-r' 'Sender <[email protected]>') 
PARAMS+=('-s' "$SUB") 
PARAMS+=('-A' "$LOG")    # use conditional with if statement 

{ echo -n 'MESSAGE: '; body; } | mail "${PARAMS[@]}" '[email protected]' 

プログラムの先頭にメールを入れてコードをテストすることができます。

mail() { echo mail "[email protected]"; cat; } 
+0

これは、配列変数内の変数置換を処理しますか? –

+0

配列に値を追加すると、変数の置換が行われます。一重引用符を使用すると置換は行われず、二重引用符を使用すると置換が行われます。変数は1回だけ評価されます。配列を 'mail'に渡すとき、配列値の代わりに配列自体が置換されることはありません。それ以外の場合、評価は2回発生します。 – ceving

+0

この解決策は、$ PARAMSが置換されたときに単一引用符を削除しません。 –

関連する問題