2013-04-09 11 views
10

Sto provando a farlo senza aggiungere altro codice, ad esempio un altro ciclo. Posso creare la logica positiva del confronto di una stringa con un array. Anche se desidero la logica negativa e stampo solo i valori non presenti nell'array, essenzialmente si tratta di filtrare gli account di sistema.In Bash come vedi se una stringa non si trova in una matrice?

mia directory ha i file in questo modo:

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

Questo è il codice che ho usato per fare un match positivo se il file si trova nella directory:

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

Qualsiasi aiuto nel la giusta direzione sarebbe apprezzata, grazie.

+1

Probabilmente si intende 'per file in utente/*; do' (notare il ';') – devnull

+0

Grazie, qualcuno ha apportato una modifica alla mia domanda e rimosso accidentalmente il ritorno a capo. – blamonet

risposta

13

È possibile negare il risultato della partita positiva:

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

o

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

Tuttavia, notare che se $account uguale a "utente", si otterrà una corrispondenza, in quanto abbina una sottostringa di "power_user". È meglio iterare esplicitamente:

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

Ho modificato la mia domanda originale, grazie per i chiarimenti. – blamonet

+0

Scusa, non ho letto attentamente la tua domanda. Ho modificato questo per rispondere effettivamente alla tua domanda ora. – chepner

+0

Ottimo consiglio, grazie. – blamonet

Problemi correlati