Command-Line

笨蛋怪異的動作

  • July 11, 2013

我寫了一個小腳本來從不同主題的列表中發送多封郵件。

#!/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外部引號被視為萬用字元模式的空格分隔列表,然後整個命令替換的結果再次被視為以空格分隔的萬用字元模式列表)。

您的命令導致此錯誤的唯一方法是 ifecho $subject` `echo $mailadd為空。僅當兩者都包含空格時才會發生這種情況echo $subject,並且echo $mailadd僅當兩個變數subjectmailadd為空時才會發生這種情況(加上一些奇怪的情況,例如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

引用自:https://unix.stackexchange.com/questions/82656