2017-04-13 102 views
0

我有以下用于发送电子邮件报告的bash脚本。我试图让它在bash上的邮件命令正常工作,并且想要使用需要使用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]" 

在运行下面的代码,我必须要通过$ 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] 

如何传递到$ params到邮件命令传递主题(-s)引述字符串?

回答

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

更新,因为我觉得你缺乏一些基本的shell编程知识。

  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

变量替换发生在向数组中添加值时。当您使用单引号时,不会进行替换,并且在使用双引号替换完成时。变量只能评估一次。将数组传递给'mail'时,不会对数组值进行替换,只是在数组本身上进行替换。否则评估会发生两次。 – ceving

+0

该解决方案在替换时不会删除$ PARAMS周围的单引号。 –