不带单引号的bash变量替换

不带单引号的bash变量替换,bash,shell,email,eval,Bash,Shell,Email,Eval,我有以下用于发送电子邮件报告的bash脚本。我试图在bash上使用mail命令使其正常工作,并希望使用变量替换条件,这需要使用eval #!/bin/bash LOG="/tmp/error.txt" echo "test" > $LOG INCLUDED="aaaaaaaaaaaaaaaaa" EXCLUDED="bbbbbbbbbbbbbbbbb" STR=INCLUDED BODY=" Email Body: \${!STR}" #Set STR based on some

我有以下用于发送电子邮件报告的bash脚本。我试图在bash上使用mail命令使其正常工作,并希望使用变量替换条件,这需要使用eval

#!/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 <ret@address.com>\""
PARAMS+=" -s \"$SUB\""
PARAMS+=" -A $LOG"              # use conditional with if statement

eval echo \"MESSAGE: "${BODY}"\" | mail $(eval echo ${PARAMS}) "user@email.com"

如何将$PARAMS传递给mail命令,并将subject(-s)作为带引号的字符串传递

改用数组,并将每个字符串放入数组元素中

params=('-r')
params=("${params[@]}" ' Sender <ret@address.com>')

mail "${params[@]}"
您可以通过在程序的开头放置邮件模型来测试代码

mail() { echo mail "$@"; cat; }

这是否处理数组变量内的变量替换?这将导致相同的问题在向数组中添加值时会发生变量替换。当您使用单引号时,不会进行替换,当您使用双引号时,会进行替换。变量只计算一次。将数组传递给
mail
时,不会对数组值进行替换,只对数组本身进行替换。否则,求值将发生两次。此解决方案在替换$PARAMS时不会删除$PARAMS周围的单个引号。请从代码中删除所有
eval
s。它们不是必需的,而且会让你感到困惑。你为什么建议删除eval?那么如何替换$STR和$SUB呢
params=('-r')
params+=(' Sender <ret@address.com>')

mail "${params[@]}"
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 <ret@address.com>')
PARAMS+=('-s' "$SUB")
PARAMS+=('-A' "$LOG")              # use conditional with if statement

{ echo -n 'MESSAGE: '; body; } | mail "${PARAMS[@]}" 'user@email.com'
mail() { echo mail "$@"; cat; }