2017-04-13 100 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周圍的單引號。 –