Command-Line
笨蛋怪異的動作
我寫了一個小腳本來從不同主題的列表中發送多封郵件。
#!/bin/bash while read -a line do mailadd=${line[0]} subject=${line[1]} mutt -s `echo $subject` `echo $mailadd` < /home/emanuele/testomail.txt done < prova.txt
腳本工作正常並發送郵件,但 mutt 告訴我他需要一個
-s
選項。mutt: option requires an argument -- 's' Mutt 1.5.21 (2010-09-15)
我不明白為什麼腳本工作正常但 mutt 退出並出現錯誤。我該如何解決?
首先,
echo $subject
是一種複雜的書寫方式$subject
(除瞭如果它包含空格或 ,它會更多地破壞值\[*?
,因為$subject
外部引號被視為萬用字元模式的空格分隔列表,然後整個命令替換的結果再次被視為以空格分隔的萬用字元模式列表)。您的命令導致此錯誤的唯一方法是 if
echo $subject` `echo $mailadd
為空。僅當兩者都包含空格時才會發生這種情況echo $subject
,並且echo $mailadd
僅當兩個變數subject
都mailadd
為空時才會發生這種情況(加上一些奇怪的情況,例如subject
字元?
和目前目錄包含名稱為單個空格的文件)。所以很可能你的輸入文件中有一些空白行。
"$somevar"
您應該始終在變數替換和命令替換 ( , )周圍加上雙引號,"$(somecommand)"
除非您真正的意思是將變數的值解釋為文件萬用字元模式的空格分隔列表。mutt -s "$subject" "$mailaddr" <~/testeomail.txt
如果輸入文件中有空行,請跳過它。
while read -a line; do mailadd=${line[0]} subject=${line[1]} if [ -z "$subject" ]; then continue; fi mutt -s "$subject" "$mailadd" < /home/emanuele/testomail.txt done < prova.txt