所以我有这个大学家庭作业,我需要向特定学生组(在diak.lst文件中列出)的所有人发送电子邮件,并将文件中的文本附加到邮件中。学生的地址形式类似:xy9999,2个字符和4个数字。问题似乎出在系统部分,它说没有"附加文件"这样的东西。
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
mail
看到的字符串中 $3 之前没有空格 - 尝试将"Attention!"" $3
更改为 "Attention!" " $3
。
你有fs=" "
什么都不做。也许你的意思是FS=" "
但这是默认值,所以它什么也不做。
您的输入文件有一个逗号分隔的标题行,因此在处理 $3 等时将为空,请添加一个 NR>1
子句。
awk 变量已经初始化为 0/NULL,因此无需nr_sent_to=0
。然后,您必须在 END 部分中打印时添加+0
,以确保在没有发送电子邮件时打印数字零而不是 NULL 字符串。
鉴于您在 BEGIN 部分中所做的一切都没有做任何有用的事情,请删除 BEGIN 部分。
不会影响脚本执行,但:awk 不是 C - 丢失所有无用的尾随分号。
将条件放在脚本的条件部分,而不是操作部分。
引用你的外壳变量。
因此,通过更多的清理,最终结果将是:
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