![当条件失败时如何将邮件正文发送为失败?](https://linux22.com/image/148320/%E5%BD%93%E6%9D%A1%E4%BB%B6%E5%A4%B1%E8%B4%A5%E6%97%B6%E5%A6%82%E4%BD%95%E5%B0%86%E9%82%AE%E4%BB%B6%E6%AD%A3%E6%96%87%E5%8F%91%E9%80%81%E4%B8%BA%E5%A4%B1%E8%B4%A5%EF%BC%9F.png)
我有一个 S3 存储桶...其中文件每天都会上传,我应该邮寄它们...邮件工作正常...但是当文件未上传时,邮件将以空邮件正文发送...如何我可以在邮件正文中输入“失败”吗...当条件失败时
如果文件上传,上面的代码每天都会邮寄文件...但是如果文件没有上传,它会以空邮件正文发送...但是如果文件没有上传,我应该以“失败”的形式邮寄,该怎么做。我在循环中尝试过,它对我不起作用我如何在同一封邮件中邮寄两个 s3 存储桶内容
答案1
为简单起见,请分步骤进行:
- 将消息保存到临时文件。
- 检查消息是否为空。
- 采取适当的行动。
- 删除临时文件。
#!/bin/sh
tmpfile=$(mktemp)
aws s3 ls "s3://project/js/Historical/$(date +'%Y/%m_%B/')" |
grep -Fe "$DATE" |
sort -rh |
head -n 2 |
awk -v OFS='\t' '{ print $1, $2, $4 }' >"$tmpfile"
if [ -s "$tmpfile" ]; then
mail -s 's3' [email protected] <"$tmpfile"
else
mail -s 's3 (failed)' [email protected] <<MESSAGE_END
Something failed.
You should check it.
MESSAGE_END
fi
rm -f "$tmpfile"
另请注意所做的其他更改:
- 正确引用 URI
s3:
(它包含命令替换)。 - 调用
date
一次而不是三次(否则如果在特定时间运行可能会导致问题)。 - 使用
-Fe
withgrep
来匹配未知字符串。 - 正确引用
awk
脚本并用于OFS
将输出字段分隔符设置为制表符(以提高可读性)。
对于那些不喜欢编写重复代码的人(“DRY”原则):
#!/bin/sh
tmpfile=$(mktemp)
aws s3 ls "s3://project/js/Historical/$(date +'%Y/%m_%B/')" |
grep -Fe "$DATE" |
sort -rh |
head -n 2 |
awk -v OFS='\t' '{ print $1, $2, $4 }' >"$tmpfile"
subject='s3'
if [ ! -s "$tmpfile" ]; then
subject="$subject (failed)"
cat >"$tmpfile" <<MESSAGE_END
Something failed.
You should check it.
MESSAGE_END
fi
mail -s "$subject" [email protected] <"$tmpfile"
rm -f "$tmpfile"
在评论aws s3 ls
,寻求处理两个调用的解决方案。
以下代码将循环存储桶 URI 数组,将每个文件列表放入单独的临时文件中,并在管道产生空结果bash
时插入自定义消息。aws
最后,所有消息都会被连接并发送出去,然后才会被删除。
#!/bin/bash
bucket=( "s3://project/js/Historical/$(date +'%Y/%m_%B/')"
"s3://some-other-path" )
msgfile=()
for uri in "${bucket[@]}"; do
tmpfile=$(mktemp)
msgfile+=( "$tmpfile" )
aws s3 ls "$uri" |
grep -Fe "$DATE" |
sort -rh |
head -n 2 |
awk -v OFS='\t' '{ print $1, $2, $4 }' >"$tmpfile"
if [ ! -s "$tmpfile" ]; then
cat >"$tmpfile" <<MESSAGE_END
Something failed for bucket "$uri".
You should check it.
MESSAGE_END
fi
done
cat "${msgfile[@]}" |
mail -s 's3 file listings' [email protected]
rm -f "${msgfile[@]}"
(未经测试)
答案2
我相信该grep
命令是您想要实现条件的地方。您可以使用以下语法来实现此目的:
grep ${DATE} && : || echo "Fail"
这是一个 bash 构造,它是标准 if..else..fi 语句的缩短版本。
这里的想法是,如果grep
找到匹配项,则不执行任何操作(使用:
运算符)。这将允许 grep 的输出流向管道中的下一个命令。
如果grep
无法从标准输入中找到匹配项,则输出字符串“Fail”。
完整的管道应该是:
aws s3 ls s3://project/js/Historical/$(date +%Y)/$(date +%m)_$(date +%B/) | grep ${DATE} && : || echo "Fail" | sort -rh | head -n 2 | awk {' print $1"\t"$2"\t"$4'} | mail -s "s3" "[email protected]"
您可以根据需要更改输出字符串,但您需要使用管道中的以下命令(sort
、head
和awk
)来验证它是否正常工作。