2013-04-09 11 views
10

Próbuję to zrobić bez dodawania dodatkowego kodu, na przykład innego dla pętli. Mogę stworzyć pozytywną logikę porównywania łańcucha z tablicą. Chociaż potrzebuję logiki negatywnej i drukuję tylko wartości spoza tablicy, to zasadniczo chodzi o odfiltrowanie kont systemowych.W Bash, jak można sprawdzić, czy ciąg nie jest w tablicy?

Mój katalog zawiera pliki w nim tak:

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

Jest to kod kiedyś zrobić pozytywny meczu, jeśli plik ten znajduje się w katalogu:

#!/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 

Każda pomoc w Właściwy kierunek byłby doceniany, dzięki.

+1

Prawdopodobnie chodziło o 'dla pliku w user/*; do '(zanotuj'; ') – devnull

+0

Dzięki, ktoś dokonał edycji mojego pytania i przypadkowo usunął powrót karetki. – blamonet

Odpowiedz

13

Można negować wynik pozytywny meczu:

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

lub

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

jednak zauważyć, że jeśli $account równa "user", dostaniesz mecz, ponieważ pasuje podciąg "power_user". Najlepiej iterować jawnie:

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

Edytowałem moje oryginalne pytanie, dzięki za wyjaśnienia. – blamonet

+0

Niestety, nie przeczytałem dokładnie tego pytania. Zmontowałem to, aby odpowiedzieć na twoje pytanie. – chepner

+0

Świetna rada, dziękuję. – blamonet