web-dev-qa-db-fra.com

Comment vérifier si grep n'a pas de sortie?

J'ai donc besoin de vérifier si le nom d'utilisateur du destinataire est dans/etc/passwd qui contient tous les utilisateurs de ma classe, mais j'ai essayé quelques combinaisons différentes d'instructions if et grep sans succès. Le mieux que j'ai pu trouver est ci-dessous, mais je ne pense pas que cela fonctionne correctement. Ma logique derrière cela est que si le grep est nul, l'utilisateur n'est pas valide.

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 
}
23
Duncan

Faites simplement un simple si comme ceci:

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

L'option -q est utilisée ici juste pour faire grep silencieux (ne pas sortir ...)

43
Marcellus

Utilisez getent et vérifiez le code de sortie de grep. Évitez d'utiliser/etc/passwd. Équivalent dans la coque:

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

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

Votre morceau de code

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

Vous n'avez pas enregistré les résultats de grep $address /etc/passwd dans une variable. avant de le placer dans l'instruction if, puis de tester la variable pour voir si elle est vide.

Vous pouvez l'essayer comme ça

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

La vérification -z concerne les chaînes variables que votre grep ne donne pas. Pour donner une valeur à partir de votre commande grep, mettez-la entre $ ():

if [ -z $(grep $address /etc/passwd) ]
3
alienchow

le plus simple sera celui-ci

$ cat test123
12345678

$ cat test123 | grep 123 >/dev/null && echo "grep result exist" || echo "grep result doesn't exist"
grep result exist

$ cat test123 | grep 999 >/dev/null && echo "grep result exist" || echo "grep result doesn't exist"
grep result doesn't exist

0
antigenius