【问题标题】:Mailing multiple files unregarding file existence邮寄多个文件,不管文件是否存在
【发布时间】:2017-02-14 11:14:43
【问题描述】:

我在一封邮件中向自己发送多个文件:

file1="/somedir/file1.md"
file2="/somedir/file2.md"
file3="/somedir/file3.md"
file4="/somedir/file4.md"
echo "Body text" | mailx -s "The Files" -a "${file1}" -a "${file2}" -a "${file3}" -a "${file4}" recipient@domain.com

这些文件并不总是存在,因此如果这些附件中的任何一个不存在,则不会发送邮件。但是,无论如何我想发送带有附件的邮件。我可以构建一个 if 语句,其中嵌套了多个其他 if 语句,但这似乎有点不妥。有什么更好的方法?

【问题讨论】:

  • 您也可以使用touch创建丢失的文件,如果没有文件,则会创建一个新文件。不好的一面是你会发送空附件
  • 宁愿不发送空附件。

标签: bash attachment mailx


【解决方案1】:

构建一个参数数组(也来自候选数组):

files=(/somedir/file1.md
       /somedir/file2.md
       /somedir/file3.md
       /somedir/file4.md)


for f in "${files[@]}"; do
    [[ -f "$f" ]] && attachments+=(-a "$f")
done

echo "Body text" | mailx -s "The files" "${attachments[@]}"

【讨论】:

  • 这比不使用数组有什么好处?
  • 它确保需要引用的文件名保持原样。
【解决方案2】:

您可以通过过滤掉不存在的文件来动态构建-a 选项:

files_arg=
for file in /somedir/file1.md /somedir/file2.md /somedir/file3.md /somedir/file4.md ~/.bashrc; do
    [[ -f $file ]] && files_arg="$files_arg -a $file"
done
echo $files_arg

输出:

-a /home/max/.bashrc

【讨论】:

  • 不要为此使用常规参数;使用数组。
  • @chepner 然后发布您自己的答案。
  • 如果其中一个文件被命名为updated data.md怎么办?
  • @chepner 引用它。
  • 你不能。 $files_arg 产生-a updated data.md"$files_arg" 产生"-a update data.md"files_arg="$files_arg -a \"$file\"" 只是在字符串中添加文字引号。您不能使用这种方法安全地容纳任意文件名。
猜你喜欢
  • 1970-01-01
  • 2022-11-04
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多