nazares
@nazares
Software Engineer

Как в bash реализовать условие по списку?

Есть рабочий скрипт на Bash который в цикле перебирает каталоги и если внутри этих каталогов не существует нужного, то создаёт его. Но так же есть список каталогов которые нужно игнорировать. Все работает, но не устраивает длинное условие или. Пробовал в цикле подставлять и так и этак но что-то не работает. Так как походу оно сравнивает только первое значение и в итоге выводит список всех подкаталогов вместе с теми которые нужно игнорировать.

Рабочий вариант скрипта.
function iterate() {
    for entry in $@; do
        if [[ $entry != *folder1* && $entry != *folder2* && $entry != *folder3* и так далее ]]; then
            if [ ! -d “$entry/content” ]; then
                echo $entry
                 mkdir -p $entry/content/folderA
            fi
         fi
done
}

iterate /folder/*
iterate /folder/*/*


Вот собственно вопрос как избавится от длинного if или или или.... и подставлять в условие значение из массива, а ещё лучше из файла blacklist?

Пробовал делать как-то так
BLIST = "
*folder1*
*folder2*
*folder3*
*folder4*
"

function iterate() {
    for entry in $@; do
        for BL in ${BLIST}; do
        if [[ $entry != $BL ]]; then
            if [ ! -d “$entry/content” ]; then
                echo $entry
                 mkdir -p $entry/content/folderA
            fi
         fi
        done
done
}

iterate /folder/*
iterate /folder/*/*


Выводит весь список вместе с запрещенными
PS: не могу сообразить как правильно сделать
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
просто юзайте break/continue
#!/bin/bash
LIST=( 1 2 3 4 5 6 7 8 9 10 )
BLIST=( 1 4 7 )

for entry in ${LIST[*]}; do
    for bl_dir in ${BLIST[*]}; do [[ $entry == $bl_dir ]] && continue 2; done
    echo $entry
done


bash.exe a.sh
2
3
5
6
8
9
10
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы