我编写了一个小脚本来从具有不同主题的列表中发送多封邮件。
#!/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 退出时出现错误。我该如何修复它?
答案1
首先,`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