Пробелы, переносы... как у баша с этим
через все запутано!
Задача, стало быть, такая.
Скрипт читает (ls) список файлов в каталоге, грепает и выводит в диалоговое графическое окно zenity (с чекбоксами).
Я расставляю мышою галки, жму «одобрямс» и скрипт дальше переваривает отобранное файло по алгоритму.
Чтобы вам репу не чесать, очень простой и понятный
ликбез про zenity от Межделмаша, см. конкретно
листинг 6.
И вот, например, отфильтровываем жыпеги:
found_img=$(ls -1 $incoming_dir | egrep '\.jpg$')
И пытаемся из этого списка в столбик слепить строчку из пар вида
TRUE "filename1.jpg" TRUE "filename2.jpg" [...]
разделенных все теми же пробелами.
Каждая такая пара призвана образовать в окошке zenity заранее взведенный чекбокс (ибо TRUE) или сброшенный (если написать FALSE) и то, что чекается этим чекбоксом (filenameNNN.jpg).
Например, так:
IFS=$'\n'
for i in $found_img; do
columns="$columns TRUE \"${i}\" "
done
(баш изначально путается в пробельных символах, отчего снабжен костыликом)
...или такой вот костылятор:
columns=$(echo -e "$found_img" | sed 's/^/TRUE \"/g; s/$/"/g')
columns=$(echo ${columns})
и пытаемся вставить ее, строку эту, в качестве параметров в конец команды zenity:
to_imgconvert=$(zenity --list --checklist --multiple --title="Обработка картинок" --text="Отметьте картинки для ресайза:" --column="Обработать" --column="Картинка" ${columns})
В итоге хочется получить имена файлов, предварительно автоматически отфильтрованные грепом, а потом прореженные моей мышевозной дланью.
Как ни странно, это работает. Но. Ровно до того момента, когда в имени файла попадется пробел. В окошке zenity стройные ряды превращаются черт знает во что, хотя вывод на печать
echo -e ${columns}
рисует ровный кошерный ряд из TRUE и закавыченных имен файлов.
Если взять и спопипастить в zenity с экрана то, что рисует
echo -e ${columns}, zenity отрабатывает отлично, невзирая на пробелы в именах файлов. А через доллар не вставляется.
Как тут я не извращался (начиная с подмены $IFS), как ни занимался непотребством с кавычками и скобочками, так ни черта и не вышло. Неужто лишь eval спасет отца русской демократии? (не пробовал пока.) Или как-то через пайп/поток надо?
Другие языки не предлагать, вопрос чисто про баш.