Исключить два или более каталогов в bash для цикла

#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