所以我有这个单一的家庭作业,我需要向一组学生(在diak.lst文件中列出)的所有人发送电子邮件,并将文件中的文本附加到邮件同样。学生的地址形式类似:xy9999,2个字符和4个数字。 问题似乎出现在SYSTEM部分,它说没有" attachfile"。
diak.lst采用以下格式:
F-名称,姓名,地址,组
乔治彼得gp9999 511
这是脚本
#!/bin/bash
if [ ! -f $2 ]
then echo $2 Not a file!!
exit 1
fi
awk -v group=$1 -v attachedfile=$2 'BEGIN {fs=" ";nr_sent_to=0;}
{
if ($4==group){
system("mail -s \"Attention!\"" $3 " < " attachedfile);
nr_sent_to++;
}
}
END {
print nr_sent_to,"-have received the mail";
}
' diak.lst
答案 0 :(得分:2)
在字符mail
看到$ 3之前,你没有空格 - 尝试将\"Attention!\"" $3
更改为\"Attention!\" " $3
。
你fs=" "
什么也没做。也许你的意思是FS=" "
,但这是默认值,所以它什么都不做。
您的输入文件有一个逗号分隔的标题行,因此当处理$ 3等空白时,请添加NR>1
子句。
awk vars已经初始化为0 / NULL,因此不需要nr_sent_to=0
。你必须在END部分打印时添加+0
,以确保在没有发送电子邮件的情况下打印数字而不是NULL字符串。
鉴于您在BEGIN部分所做的一切都没有用,请摆脱BEGIN部分。
不会影响脚本执行但是:awk不是C - 丢失所有无用的尾随分号。
将条件放在脚本的条件部分,而不是动作部分。
引用你的shell变量。
因此,通过更多清理,最终结果将是:
awk -v group="$1" -v attachedfile="$2" '
NR>1 && ($4==group) {
system("mail -s \"Attention!\" " $3 " < " attachedfile)
nr_sent_to++
}
END {
print nr_sent_to+0, "-have received the mail"
}
' diak.lst