LINUX.ORG.RU

Добавить кавычки в значение переменной

 


0

1

Всем доброго времени суток.

Нашаманил такую штуку. Но, нужно, чтобы значение переменной $files было в кавычках. Как это можно сделать и можно ли в принципе?

#!/bin/bash
DIR="/home/blabla/roman/Рабочий стол/wiki/"
mail=roman@blabla.ru

find "$DIR" -type f | while read files; do
    subject=`echo "$files" | sed 's|.*/||; s/\.[^.]* /,/g; s/\.[^.]*$//'`
    attach="-a "$files
    echo "Test | mailx -A siz37 -s "$subject" $attach $mail"
done

Т.е. я получаю вывод:

Test | mailx -A blabla -s снимок5 -a /home/blabla/roman/Рабочий стол/wiki/снимок5.png roman@blabla.ru

А нужен:

Test | mailx -A blabla -s снимок5 -a "/home/blabla/roman/Рабочий стол/wiki/снимок5.png" roman@blabla.ru


а лучше одинарные ковычки \'

Silerus ★★★★
()
Ответ на: комментарий от Dark_SavanT

Блин, ну не настолько же всё просто(

hanharr
() автор топика
subject=`echo "$files" | sed 's|.*/||; s/\.[^.]* /,/g; s/\.[^.]*$//'`

Если здесь извлекается имя файла без пути, то для этого есть basename

anonymous
()
Ответ на: комментарий от Dark_SavanT

Не подскажите еще по такому моменту

Не знаю как так, но теперь mailx не понимает, что там есть файл.

#!/bin/bash
DIR="/home/blabla/roman/Рабочий стол/wiki/"
mail=roman@blabla.ru

find "$DIR" -type f | while read files; do
    subject=`echo "$files" | sed 's|.*/||; s/\.[^.]* /,/g; s/\.[^.]*$//'`
    attach="-a "\"${files}\"
    echo "Test" | mailx -A siz37 -s "$subject" "$attach" $mail
    echo "${attach}"
done

mailx говорит, что там ничего нет, а $attach пишет, что есть. Как так может быть?

 "/home/blabla/roman/Рабочий стол/wiki/снимок5.png": Нет такого файла или каталога
-a "/home/blabla/roman/Рабочий стол/wiki/снимок5.png"
 "/home/blabla/roman/Рабочий стол/wiki/снимок3.png": Нет такого файла или каталога
-a "/home/blabla/roman/Рабочий стол/wiki/снимок3.png"
hanharr
() автор топика
Ответ на: комментарий от anonymous

С .png это просто тест. В конечном варианте надо будет отправлять файлики .xls/.odt/.xml и че там бухгалтера еще могут наколдовать и пихать названия этих файлов в тему письма.

hanharr
() автор топика

Ты в ОП-посте сделал echo "Test | mailx...", а потом стал полученные советы совать в echo "Test" | mailx.... Разумеется, это не сработало. На самом деле тебе НЕ нужно добавлять кавычки в значение переменной attach.

legolegs ★★★★★
()
Ответ на: Не подскажите еще по такому моменту от hanharr
#!/bin/bash
DIR="/home/blabla/roman/Рабочий стол/wiki/"
mail=roman@blabla.ru

find "$DIR" -type f | while read files; do
    subject=`basename "$files"`
    echo "Test" | mailx -A siz37 -s "$subject" -a "$files" $mail
    echo "${files}"
done
anonymous
()
Ответ на: комментарий от hanharr

Ну если не убирать расширения, то basename

anonymous
()
Ответ на: комментарий от hanharr

В кавычках должен быть каждый аргумент вызываемой программы, который может содержать пробелы, чтобы шелл мог разобрать команду и передать в вызываемую программу в виде массива argv. Самой программе кавычки вокруг имён файлов не нужны. Анон правильно написал выше.

legolegs ★★★★★
()
Ответ на: комментарий от hanharr

Так строку аргументов нужно собирать там где ей место, а не распихивать куски непонятно где.

Ну а раз так делаешь, то по правилам вычисления кавычек надо делать:


attach="-a '${files}'"

anonymous
()
Ответ на: комментарий от anonymous
DIR="/home/blabla/roman/Рабочий стол/wiki/"
mail=roman@blabla.ru

find "$DIR" -type f | while read files; do
    subject=`echo "$files" | sed 's|.*/||; s/\.[^.]* /,/g; s/\.[^.]*$//'`
    attach="-a '${files}'"
    echo "Test" | mailx -A siz37 -s "$subject" $attach $mail
    echo $attach
done
'/home/blabla/roman/Рабочий: Нет такого файла или каталога
-a '/home/blabla/roman/Рабочий стол/wiki/снимок4.png'

Толи я...толи не знаю.

hanharr
() автор топика
Ответ на: комментарий от hanharr

В общем делай как все делают:


DIR="/home/blabla/roman/Рабочий стол/wiki/"
mail=roman@blabla.ru

find "$DIR" -type f | while read files; do
    subject=`echo "$files" | sed 's|.*/||; s/\.[^.]* /,/g; s/\.[^.]*$//'`
    echo "Test" | mailx -A siz37 -s "$subject" -a "${files}" $mail
    echo $files
done

anonymous
()
Ответ на: комментарий от anonymous

Так работает, да

Штука в том, что допустим в директории 4 файлика, и я хочу все 4 прикрепить. Идея была в том, чтобы получить строку вида -a /path/file -a /path/file -a /path/file и подпихнуть её на место $attach.

hanharr
() автор топика
Ответ на: Так работает, да от hanharr

что допустим в директории 4 файлика, и я хочу все 4 прикрепить

Так бы сразу и сказал!

DIR="/home/blabla/roman/Рабочий стол/wiki/"
mail=roman@blabla.ru

attachments=()
find "$DIR" -type f | while read file; do
  attachments+=(-a "$file")
done
echo "Test" | mailx -A siz37 -s "$subject" "${attachments[@]}" $mail
legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Вот так надо делать.

А если просто собирать командную строку как строку, то какой-нибудь бухгалтер приложит письмо с именем $(rm -rf ~), и всё навернётся.

anonymous
()
Ответ на: комментарий от legolegs

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

hanharr
() автор топика
Ответ на: комментарий от hanharr

Да уже видно, что не лучший. Например лучше не кучу файлов присобачивать, а паковать их и присобачивать архив. А в тело (вместо Test) пихать список.

anonymous
()
Ответ на: комментарий от anonymous

Архив не вариант, «кладовщикам так не удобно» тьфу

Тело можно вообще будет оставить пустым, нужно чтобы в теме письма был список и это я победил. Осталось научить эту конструкцию собирать из разных папочек и группировать. С группировкой чую будет самая жопа.

hanharr
() автор топика
Ответ на: комментарий от hanharr

Архив не вариант, «кладовщикам так не удобно» тьфу

Ну рассказывай какая у тебя общая задача. Какие готовые свободные системы рассмотрел и почему не сумел их применить.

anonymous
()
Ответ на: комментарий от anonymous

Есть каталоги в названии которых города РФ (Питер, Москва и т.д.) и в них сваливают файлы из 1с и заявки в виде .doc файлов. При этом, у некоторых городов есть внутри еще папки с пригородом (Москва -> Зеленогорск) и если файлики отправляются для пригорода, то его название надо подставить в тему письма.

Бухи хотят, чтобы допустим раз в 15 минут из этих папок файлики рассылались по складам автоматически. При этом, они еще и группировать хотят документы комплектами, благо это они как-то неуверенно сказали и там в принципе можно по названию организации сортировку сделать.

Честно сказать, не представляю, чтобы для такого существовали готовые решения, погуглил может для thunderbird есть какой плагин. Ну, и собственно осталось накостылить скрипт.

По идее, сейчас уже из папки можно собрать файлики и переслать (думаю, если я даже для каждого файла буду слать отдельное письмо, то они не захотят делать дальше ручками). Поэтому теперь надо придумать как обходить каталоги и собирать из каждого. Подозреваю, что с этого стоило начинать, но уже поздно. :D

hanharr
() автор топика
Ответ на: комментарий от hanharr

Т.е. надо просто держать у кладовщиков синхронную копию части дерева каталогов?

Ты же понимаешь, что для этого сделан rsync?

А вот уже его вывод (сколько добавлено, обновлено и удалено) можно парсить и выдавать в виде списка задач.

Или любая система контроля версий.

Или наконец ecm (фор экзампл)

anonymous
()
Ответ на: комментарий от anonymous

По идее, по идее файлы лежат на виндовой шаре и по человечески просто прокинуть её можно. Но, там имеются свои нюансы и в итоге «давайте по почте». По вашему вообще реально примерно исполнить задумку? Просто, мне для себя интересно, вот и ковыряю.

hanharr
() автор топика
Ответ на: комментарий от hanharr

Кончится всё тем, что очень-очень важный файлы не пройдёт через почту, вот и всё. И выясниться это в самый неподходящий момент. И вот чем ты быстро заменишь свой колхоз? Кладовщики умеют собирать разрезанный архив?

Или вот ещё что - у тебя нет обратной связи. Если это всё накроется как ты узнаешь? Ведь неприход файла обычно не бросается в глаза.

anonymous
()
Ответ на: комментарий от anonymous

Хм, да. Теперь есть над чем покумекать.

hanharr
() автор топика
Ответ на: комментарий от legolegs

Подскажите, в этом случае «${attachments[@]}» получается пустым. При этом если сделать вывод массива в цикле, то он накапливается.

hanharr
() автор топика
Ответ на: комментарий от hanharr

Да, извиняюсь, забыл, что while после пайпа работает в сабшелле и не может менять переменные. Вот так придётся:

DIR="/home/blabla/roman/Рабочий стол/wiki/"
mail=roman@blabla.ru
mkfifo /tmp/filelist.tmp
trap "rm '/tmp/filelist.tmp'" EXIT
find "$DIR" -type f  > /tmp/filelist.tmp &
attachments=()
while read file; do
  attachments+=(-a "$file")
done < /tmp/filelist.tmp
echo "Test" | mailx -A siz37 -s "$subject" "${attachments[@]}" "$mail"
legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Спасибо большое. Я то уже полез в функции. Правда, там получил схожий эффект..

hanharr
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.