2017-02-14 19 views
1

Я посылаю несколько файлов в один почте себе:рассылки несколько файлов unregarding существование файла

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}" [email protected] 

Эти файлы не всегда, так что если какой-либо из этих приложений не существует почты не будет отправлять , Однако я хочу отправить почту в любом случае с вложениями, которые там есть. Я мог бы построить оператор if с несколькими другими операторами if, вложенными внутри него, но это кажется немного коварным. Что лучше?

+0

Вы также можете создать отсутствующие файлы с помощью 'touch', который создаст новый файл, если его там нет. Плохая сторона - вы отправите пустые вложения –

+0

Скорее не отправляйте пустые вложения. – Swifting

ответ

0

Вы можете создать -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 
+0

Не используйте для этого обычный параметр; используйте массив. – chepner

+0

@chepner Отправьте свой собственный ответ. –

+0

Что делать, если один из файлов называется 'updated data.md'? – chepner

3

наращивать массив аргументов (из массива кандидатов, слишком):

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[@]}" 
+0

Как это лучше, чем когда не используется массив? –

+1

Он гарантирует, что имена файлов, которые должны быть указаны, остаются такими. – chepner