私は電子メールレポートを送信するための次の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を渡すのですか?
これは、配列変数内の変数置換を処理しますか? –
配列に値を追加すると、変数の置換が行われます。一重引用符を使用すると置換は行われず、二重引用符を使用すると置換が行われます。変数は1回だけ評価されます。配列を 'mail'に渡すとき、配列値の代わりに配列自体が置換されることはありません。それ以外の場合、評価は2回発生します。 – ceving
この解決策は、$ PARAMSが置換されたときに単一引用符を削除しません。 –