URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8414
[ Назад ]

Исходное сообщение
"Подстановка переменных"

Отправлено SLario , 27-Авг-09 13:17 
Уважаемые коллеги!
Я хочу получить список файлов по маске, написал такой скрипт:

#!/bin/bash

FileMask="*.xml | grep -v 'Default'"               # маска файла, формат такой же, как и в командной строке
SrcPath="/usr/ScriptSL/USSD/in"                    # папка-источник, в которой надо найти все файлы по маске
FileListFN="/usr/ScriptSL/USSD/XML_20090827.lst"   # название файла, в который надо вывести названия файлов

# Скрипт должен выводить все файлы, которые подходят по маске, в один столбец, вырезать из них имя папки-источника и класть в указанный файл
ls -1 "$SrcPath"/"$FileMask" | sed s-"$SrcPath"/-- > "$FileListFN"

Вот то, что получается, если сделать echo строки выше:

ls -1 /usr/ScriptSL/USSD/in/*.xml | grep -v 'Default' | sed s-/usr/ScriptSL/USSD/in/-- > /usr/ScriptSL/USSD/XML_20090827.lst

Это как раз то, что мне нужно, такая строка работает в shell, если её скопипэйстить. Однако, при попытке запуска shell вываливает мне то полный список файлов, подходящих к маске, потом пристыковывает к нему кусок скрипта после первого "|" (ничего не работает), то пытается искать grep, -v, 'Default' как отдельные файлы и ничего не находит. У меня есть чувство, что дело в кавычках. Какие кавычки надо ставить, чтобы в строку команды подставились значения переменных, а не результат их выполнения?

Заранее большое спасибо!


Содержание

Сообщения в этом обсуждении
"Подстановка переменных"
Отправлено SLario , 27-Авг-09 15:18 
Хм, а если поставить маску
FileMask="*.xml"
, то скрипт работает. С полной маской (исключающей все файлы, название которых включает слово Default) я получаю такой вывод:
|: No such file or directory
grep: No such file or directory
-v: No such file or directory
'Default': No such file or directory

"Подстановка переменных"
Отправлено phpcoder , 27-Авг-09 15:25 
>Хм, а если поставить маску
>FileMask="*.xml"
>, то скрипт работает. С полной маской (исключающей все файлы, название которых
>включает слово Default) я получаю такой вывод:
>|: No such file or directory
>grep: No such file or directory
>-v: No such file or directory
>'Default': No such file or directory

Советую использовать find.



"Подстановка переменных"
Отправлено SLario , 27-Авг-09 15:34 
Спасибо, но я хотел бы обойтись без find. Правильно сформированная строка работает так, как мне нужно, так что мне осталось только корректно подставить значения переменных в строку и запустить её! Похоже, что ls берёт не целиком сформированную строку "$SrcPath"/"$FileMask", а только до первого пробела, и использует значения, перечисленные в FileMask, как список входных директорий для команды. Я пробовал экранировать пробелы, указав в константе FileMask="*.xml\ |\ grep\ -v\ 'Default'", но это не помогло. Есть ли способ сначала сформировать текстовую строку полностью, а затем отправить её на выполнение всю целиком, без разделения?

"Подстановка переменных"
Отправлено angra , 28-Авг-09 09:21 
Ваша проблема в том, что вы не понимаете элементарного - пайпу(|) в командах обрабатывает шелл, а не ls. Решить изначальную задачу можно по разному, например так:
eval "ls -1 $SrcPath/$FileMask | sed s- $SrcPath/-- > $FileListFN"


"Подстановка переменных"
Отправлено SLario , 28-Авг-09 10:20 
angra, спасибо за решение! Возможно, я действительно пока не врубился в концепцию. У меня всё заработало, именно такого результата я и хотел добиться!