Я пишу сценарий Борна и хочу выбрать файлы, соответствующие определенным регулярным выражениям. Я делаю это с помощью тестовой структуры if, и она определяет файл, заканчивающийся на ".o". Однако, когда в каталоге есть два файла, которые я ищу и заканчивающиеся на «.o», я получаю следующую ошибку: «expr: syntax error». Как такое могло быть?
if test "`expr \"$file\" : ${SPECIFIED_DIRECTORY}/*.o`" != "0"; then
do something
fi
3 ответа
Тест на регулярное выражение почти наверняка не подходит для этой работы, но давайте предположим, что specified_directory
(строчные буквы по соглашению, чтобы избежать конфликтов с переменными среды и встроенными функциями) содержал регулярное выражение для соответствия имени каталога, а не буквальным именем, и поэтому был правильным инструментом. Если бы это было так, вы бы хотели написать ...
if expr "$file" : "$specified_directory"/'.*[.]o' >/dev/null; then
...
fi
Ни тестовой команды, ни подоболочки. Будь проще.
Если вы не экранируете .
(в данном случае, сделав его классом символов, [.]
), он имеет свое обычное значение регулярного выражения - совпадение ровно одного символа. Точно так же .*
- это способ сопоставить ноль или более любых символов в регулярном выражении, а не только *
(который является синтаксисом fnmatch).
Этот подход работает с любой оболочкой POSIX и не вызывает никаких инструментов, недоступных встроенным в оболочку, что делает его эффективным во время выполнения.
contains_any_files() {
set -- "$1"/*
[ "$#" -gt 0 ] && [ -f "$1" ]
}
if contains_any_files "$dir"; then
...
fi
Если я правильно понял, если в каталоге есть файлы .o
, то сделайте что-нибудь:
if find "$dir"/*.o >/dev/null 2>&1; then
# do something
fi
Команда find
завершится успешно, только если есть какие-либо совпадающие файлы. В противном случае он завершится с ошибкой, и блок then
не будет выполнен. >/dev/null 2>&1
скрывает stdout
и stderr
.
&>
не соответствует POSIX. Вопрос явно требует /bin/sh
.
ls
на find
. Теперь это имеет больше смысла. Я не знаю, что вообще побудило меня использовать ls
...
Похожие вопросы
Новые вопросы
string
Строка - это конечная последовательность символов, обычно используемая для текста, хотя иногда для произвольных данных.
*.o
раскрывается перед запускомexpr
, поэтому ему передается более одного аргумента с правой стороны./bin/sh
— это POSIX sh (что на самом деле ближе к ksh88), а не Bourne (который буквально представляет собой оболочку из 70-х). Вы уверены, что действительно нацелились на Борна?