LINUX.ORG.RU

Непонятки в sh-сценариях


0

0

Комманда
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 сценариию.

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








files_pattern="-name '[a-zA-Z]*' -or -name '*.h'"

find ~/work/findstr/ \( $files_pattern \) -print

anonymous

Небольшие поправки: '*.h' или '*h' здесь не важно - все равно не работает.
А все, что после "С благодарностью, Начинающий" - не обращать внимания

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

#!/bin/sh

files_pattern="-name '[a-zA-Z]*' -or -name '*h'"

eval "find ~/ \( $files_pattern \) -print"

anonymous
()

Да, с евалом работает, я уже догадался.
Спасибо.
ЗЫ - там еще замаскировать сэдом нужно мета-символы * [ ] ?.

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

=== test.sh ====
#!/bin/sh

files_pattern="-name '[aA]*' -or -name '*h'"

echo $files_pattern

exec_command="find ~/ \( $files_pattern \) -print"

echo $exec_command

=== test.sh ====

$ ./test.sh
-name '[aA]*' -or -name '*h'
find ~/ \( -name '[aA]*' -or -name '*h' \) -print


Объясни, пожалуйста, что ты собрался маскировать?

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