2014-12-10 8 views
14

Also muss ich überprüfen, ob der Empfänger Benutzername in/etc/passwd ist, die alle Benutzer in meiner Klasse enthält, aber ich habe ein paar verschiedene Kombinationen von if-Anweisungen und grep mit keinem Erfolg versucht. Das Beste, was ich mir vorstellen kann, ist unten, aber ich denke nicht, dass es richtig funktioniert. Meine Logik dahinter ist, dass wenn der Grep null ist, der Benutzer ungültig ist.Wie überprüft man, ob Grep keine Ausgabe hat?

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 
} 

Antwort

10

Gebrauch zu machen getent und checke auf grep's exit code. Vermeiden Sie die Verwendung von/etc/passwd. Äquivalent in der Shell:

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

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

tun Nur ein einfaches, wenn wie folgt aus:

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

Die Option -q verwendet wird hier nur grep ruhig (nicht ausgeben ...)

+0

simplier Lösung, wenn Sie Ergebnis nicht behalten wollen – RousseauAlexandre

+0

Wie das größer als 0 mit einem Test des Variablenwertes kombiniert werden kann? etwas wie 'if grep -q $ address/etc/passwd && $ val> 0' –

2

Die -z-Prüfung ist für variable Zeichenfolgen, die Ihr grep nicht gibt. Um einen Wert von Ihrem grep Befehl zu geben, muss er in $():

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

Ich habe diesen Weg versucht, aber es lässt mich immer noch ungültige Benutzer eingeben ... – Duncan

+0

Könnten Sie versuchen, doppelte Anführungszeichen hinzufügen? if [-z "$ (grep $ address/etc/passwd)"] Bearbeiten: Verschieben Sie auch den gesamten Teil der Echos und Mailing-Befehle in die else-Klausel, wenn sie nicht für einen ungültigen Benutzer ausgeführt werden sollen . – alienchow

2

Ihr Stück Code

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

Sie haben nicht die Ergebnisse von grep $address /etc/passwd in einer Variablen speichern. bevor Sie es in die if-Anweisung einfügen und dann die Variable testen, um festzustellen, ob sie leer ist.

Sie können es versuchen, wie diese

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