Комманда
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 сценарии.
С благодарностью, Начинающий
#!/bin/sh
files_pattern='-name [a-zA-Z]* -or -name *h'
find ~/work/ \( $files_pattern \) -print
Одинарные кавычки не расширяются (в основном).
Не знаю будет ли работать ваш пример, но мне кажется нет. Будет подстановка заместо * всякой ерунды.
Я решил эту проблему с помощью sed для маскирования * [ ] ?, и eval.
Спасибо.
>Не знаю будет ли работать ваш пример, но мне кажется нет. Будет
>подстановка заместо * всякой ерунды.
В чём не трудно убедиться...>Я решил эту проблему с помощью sed для маскирования * [ ]
>?, и eval.
Слишком мудрёно, помоему.
Проще наверно так:
A=$'a*'
find . -name "$A"
>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 как раз для этого разделены.