Bash:如何发送一封邮件而不是多封邮件

Bash:如何发送一封邮件而不是多封邮件

我正在学习 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...fifor..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]

相关内容