我正在学习 shell 脚本,但在发送电子邮件时遇到困难。在下面的代码中,我使用条件来检查文件大小,如果文件大小大于 0 字节,则发送电子邮件。
if [ -s file1 ]
printf "%s" "this is file1" | /usr/bin/mutt -s "test file" "[email protected]"
fi
if [ -s file2 ]
printf "%s" "this is file2" | /usr/bin/mutt -s "test file" "[email protected]"
fi
if [ -s file3 ]
printf "%s" "this is file3" | /usr/bin/mutt -s "test file" "[email protected]"
fi
我们可以看到,我使用了三次相同的代码,我觉得这不是一个好的编码。有什么方法可以发送一封包含所有三条消息的电子邮件吗?/usr/bin/mutt -s "test file" "[email protected]"
例如:如果所有三个文件都大于零字节,我将分别收到 3 封邮件,但我希望只收到一封邮件,如下所示。
this is file1
this is file2
this is file3
答案1
您可以>>
先使用重定向生成一个临时文件,然后发送该文件:
out=$(mktemp /tmp/message.XXXXXXXX)
printf "%s" "this is file1" >> "$out"
printf "%s" "this is file2" >> "$out"
cat "$out" | mutt -s "test file" [email protected]
rm "$out"
或者,可以使用分组多个命令{ ...; }
并将其所有输出传送到同一个进程中:
{
if [ -s file1 ]
printf "%s" "this is file1"
fi
if [ -s file2 ]
printf "%s" "this is file2"
fi
if [ -s file3 ]
printf "%s" "this is file3"
fi
} | mutt -s "test file" [email protected]
不要忘记您|
也可以将管道应用于复合命令,例如整个命令if...fi
或for..in...done
可以通过管道传输到另一个命令:
for fname in file{1..3}; do
if [ -s "$fname" ]; then
printf "%s" "this is $fname"
fi
done | mutt -s "test file" [email protected]