В Bash как вы видите, нет ли строки в массиве?

Я пытаюсь сделать это, не добавляя дополнительный код, например, другой для цикла. Я могу создать положительную логику сравнения строки с массивом. Хотя я хочу отрицательную логику и печатаю только значения не в массиве, по сути это отфильтровывать системные учетные записи.

В моем каталоге есть файлы:

admin.user.xml 
news-lo.user.xml 
system.user.xml 
campus-lo.user.xml
welcome-lo.user.xml

Это код, который я использовал для положительного соответствия, если этот файл находится в каталоге:

#!/bin/bash

accounts=(guest admin power_user developer analyst system)

for file in user/*; do

    temp=${file%.user.xml}
    account=${temp#user/}
    if [[ ${accounts[*]} =~ "$account" ]]
    then
        echo "worked $account";
    fi 
done

Любая помощь в правильном направлении была бы оценена, спасибо.

Ответ 1

Вы можете отрицать результат положительного совпадения:

if ! [[ ${accounts[*]} =~ "$account" ]]

или

if [[ ! ${accounts[*]} =~ "$account" ]]

Однако обратите внимание, что если $account равно "пользователю", вы получите соответствие, так как оно соответствует подстроке "power_user". Лучше всего итератировать:

match=0
for acc in "${accounts[@]}"; do
    if [[ $acc = "$account" ]];
        match=1
        break
    fi
done
if [[ $match = 0 ]]; then
    echo "No match found"
fi