2014-12-10 8 views
14

Quindi ho bisogno di controllare se il nome utente del destinatario è in/etc/passwd che contiene tutti gli utenti della mia classe, ma ho provato alcune combinazioni diverse di istruzioni if ​​e grep senza successo. Il meglio che ho trovato è sotto, ma non penso che funzioni correttamente. La mia logica è che se grep è nullo, l'utente non è valido.Come verificare se grep non ha output?

send_email() 
{ 
    message= 
    address= 
    attachment= 
    validuser=1 
    until [ "$validuser" = "0" ] 
    do 
    echo "Enter the email address: " 
    read address 
    if [ -z grep $address /etc/passwd ] 
     then 
    validuser=0 
    else 
     validuser=1 
    fi 
    echo -n "Enter the subject of the message: " 
    read message 
    echo "" 
    echo "Enter the file you want to attach: " 
    read attachment 
    mail -s "$message" "$address"<"$attachment" 
    done 
    press_enter 
} 

risposta

10

Usa getent e controlla il codice di uscita di grep. Evitare l'uso di/etc/passwd. Equivalente nella shell:

> getent passwd | grep -q valid_user 
> echo $? 
0 

> getent passwd | grep -q invalid_user 
> echo $? 
1 
20

Basta fare una semplice, se così:

if grep -q $address /etc/passwd 
then 
    echo "OK"; 
else 
    echo "NOT OK"; 
fi 

L'opzione -q è qui utilizzato solo per fare grep tranquilla (non di uscita ...)

+0

se non si desidera mantenere risultato – RousseauAlexandre

+0

Come può essere combinata con una prova di valore di una variabile maggiore di 0? qualcosa come 'se grep -q $ indirizzo/etc/passwd && $ val> 0' –

2

Il controllo -z è per stringhe variabili, che il tuo grep non sta dando. Per dare un valore dal comando grep, racchiuderlo tra $():

if [ -z $(grep $address /etc/passwd) ] 
+0

Ho provato in questo modo, ma mi sta ancora permettendo di inserire utenti non validi ... – Duncan

+0

Puoi provare ad aggiungere virgolette doppie? if [-z "$ (grep $ address/etc/passwd)"] Modifica: inoltre, sposta l'intera porzione di echi e comandi di posta nella clausola else se non vuoi che vengano eseguiti per un utente non valido . – alienchow

2

tuo pezzo di codice

if [ -z grep $address /etc/passwd ] 

Non hai salvare i risultati di grep $address /etc/passwd in una variabile. prima di inserirlo nell'istruzione if e quindi testare la variabile per vedere se è vuota.

Si può provare in questo modo la soluzione più semplice

check_address=`grep $address /etc/passwd` 
    if [ -z "$check_address" ] 
     then 
    validuser=0 
    else 
     validuser=1 
    fi