#bash #shell #for-loop #pattern-matching
#bash #оболочка #для цикла #сопоставление с образцом
Вопрос:
У меня есть родительский каталог с именем Stem, в этом родительском каталоге у меня около 20 подкаталогов, и имена 20 подкаталогов заканчиваются на _a, и в каждом подкаталоге есть файл с именемviolations.txt. В этих 20 подкаталогах имена двух подкаталогов — Trans_a и shift_a, мне не нужно выполнять какие-либо действия скрипта в этих двух подкаталогах. Мне нужно выполнить мой скрипт только для 18 подкаталогов.
Я попробовал приведенный ниже код, но не получил точного результата.
#!/bin/bash
echo "These warning reports are based on this run directory:" ; pwd
echo " " ;
File="violatons.txt"
for d in *_a;
do
if ( "$d"=="Trans_a"||"shift_a" ); then
True
else
Statement
fi
done
Примечание: В некоторых ситуациях подкаталоги, которые нам нужно исключить в скрипте, могут увеличиваться или уменьшаться, это зависит от ситуации.
Комментарии:
1.
if
Условие, вероятно, неверно. Попробуйте это: unix.stackexchange.com/questions/47584 /…2. @Kavitha : Вставьте свой скрипт в shellcheck . Также yur
if
не имеет смысла.if ( foo )
запускает командуfoo
в дочерней оболочке.
Ответ №1:
for f in !(Trans|shift)_a/violations.txt; do
echo "$f"
# do stuff
done
!(pattern-list)
Соответствует чему угодно, кроме одного из заданных шаблонов.
Ссылка:https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Pattern-Matching