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

Исходное сообщение
"Непонятки в sh-сценариях "

Отправлено None , 30-Дек-03 03:04 
Комманда
find ~/work/ \( -name '[a-zA-Z]*' -or -name '*h' \) -print
ищет файлы, начинающиеся с прописных и строчных букв и файлы, оканчивающиеся на h)

Перношу всю эту байду в скрипт для sh:

#!/bin/sh
find ~/work/ \( -name '[a-zA-Z]*' -or -name 'h' \) -print

все работает.

Теперь хочу чтобы шаблон поиска лежал в переменной. Казалось бы чего проще:

#!/bin/sh
files_pattern="-name '[a-zA-Z]*' -or -name '*h'"
find ~/work/ \( $files_pattern \) -print

Не находится ничего. Используя set +x для отладки понимаю, что в find sh передает '[a-zA-Z]*', но не [a-zA-Z]*, что и приводит к ненахождению.

Убираю одинарные кавычки:

#!/bin/sh
files_pattern="-name [a-zA-Z]* -or -name *h"
find ~/work/ \( $files_pattern \) -print

Выдается ошибка, так как shell за место * подставляет все х..ю. Получается, что не получается и не на елку влезть и рыбку не съесть.

Объясните как шелл работает с гребанными кавычками и как разрулить мой пример в sh сценарии.

С благодарностью, Начинающий


Содержание

Сообщения в этом обсуждении
"Непонятки в sh-сценариях "
Отправлено scum , 30-Дек-03 15:48 
#!/bin/sh
files_pattern='-name [a-zA-Z]* -or -name *h'
find ~/work/ \( $files_pattern \) -print
Одинарные кавычки не расширяются (в основном).


"Непонятки в sh-сценариях "
Отправлено None , 30-Дек-03 17:37 
Не знаю будет ли работать ваш пример, но мне кажется нет. Будет подстановка заместо * всякой ерунды.
Я решил эту проблему с помощью sed для маскирования * [ ] ?, и eval.
Спасибо.



"Непонятки в sh-сценариях "
Отправлено SergeiZz , 14-Фев-04 07:59 
>Не знаю будет ли работать ваш пример, но мне кажется нет. Будет
>подстановка заместо * всякой ерунды.
В чём не трудно убедиться...

>Я решил эту проблему с помощью sed для маскирования * [ ]
>?, и eval.
Слишком мудрёно, помоему.
Проще наверно так:
A=$'a*'
find . -name "$A"


"Непонятки в sh-сценариях "
Отправлено Виталек , 13-Фев-04 21:27 
>files_pattern="-name [a-zA-Z]* -or -name *h"
>find ~/work/ \( $files_pattern \) -print

>Выдается ошибка, так как shell за место * подставляет все х..ю.
>
>Объясните как шелл работает с гребанными кавычками и как разрулить мой пример
>в sh сценарии.

В ZSH я это сделал так (мой пример):
files_pattern="-name *.xls"
find files "${(z)files_pattern}"

поясняю: в мане по find сказано что все операнды и выражения для команды find должны быть должны быть раздельными аргументами. Флаг z как раз для этого разделены.