Comment utiliser une comparaison de fichier grep dans une instruction bash if / else?

138

Lorsque notre serveur arrive, nous devons vérifier un fichier pour voir comment le serveur est configuré.

Nous voulons rechercher la chaîne suivante dans notre fichier /etc/aws/hosts.conf:

MYSQL_ROLE=master

Ensuite, nous voulons tester si cette chaîne existe et utiliser une instruction if / else pour exécuter l'une des deux options selon que la chaîne existe ou non.

Quelle est la syntaxe BASH pour l'instruction if?

if [ ????? ]; then
  #do one thing
else
  #do another thing
fi
user77413
la source

Réponses:

205

De grep --help, mais aussi voir man grep :

L'état de sortie est 0 si une ligne a été sélectionnée, 1 sinon; si une erreur se produit et que -q n'a pas été donné, le statut de sortie est 2.

if grep --quiet MYSQL_ROLE=master /etc/aws/hosts.conf; then
  echo exists
else
  echo not found
fi

Vous voudrez peut-être utiliser une expression régulière plus spécifique, telle que ^MYSQL_ROLE=master$, pour éviter cette chaîne dans les commentaires, les noms qui commencent simplement par "master", etc.

Cela fonctionne parce que if prend une commande et l'exécute, et utilise la valeur de retour de cette commande pour décider comment procéder, avec zéro signifiant vrai et différent de zéro signifiant faux - de la même manière que les autres codes de retour sont interprétés par le shell, et l'opposé d'un langage comme C.


la source
> avec zéro signifiant vrai et non nul signifiant faux - le même que la façon dont les autres codes de retour sont interprétés par le shell, et le contraire d'un langage comme C. mais pourquoi le contraire ....?
kchoi
Parce qu'un zéro est généralement interprété comme "aucune erreur", alors que tout autre élément signifie "une erreur". Si suppose, nous voulons savoir si la commande s'est terminée avec succès.
timelmer le
33

ifprend une commande et vérifie sa valeur de retour. [est juste une commande.

if grep -q ...
then
  ....
else
  ....
fi
Ignacio Vazquez-Abrams
la source
23

Notez que, pour PIPEêtre une commande ou une séquence de commandes, alors:

if PIPE ; then
  # do one thing if PIPE returned with zero status ($?=0)
else 
  # do another thing if PIPE returned with non-zero status ($?!=0), e.g. error
fi 

Pour mémoire, [ expr ]est un raccourci shell intégré pour test expr.

Étant donné que les grepretours avec le statut 0 en cas de correspondance et le statut différent de zéro en cas de non-correspondance, vous pouvez utiliser:

if grep -lq '^MYSQL_ROLE=master' ; then 
  # do one thing 
else 
  # do another thing
fi 

Notez que l'utilisation de -lqui ne se soucie que du fichier ayant au moins une correspondance (de sorte que grepretourne dès qu'il trouve une correspondance, sans continuer inutilement à analyser le fichier d'entrée.)

sur certaines plates - formes [ expr ]ne sont pas une commande interne, mais un exécutable réel /bin/[(dont le dernier argument sera ]), ce qui explique pourquoi [ expr ]devrait contenir des espaces autour des crochets, et pourquoi il doit être suivi par l' un des séparateurs de liste de commande ( ;, &&, ||, |, &, nouvelle ligne)

vladr
la source
4
-lest redondant, greprevient immédiatement après avoir trouvé un match avec-q
Réintégrer Monica s'il vous plaît
3

utilise juste bash

while read -r line
do
  case "$line" in
    *MYSQL_ROLE=master*)
       echo "do your stuff";;
    *) echo "doesn't exist";;      
  esac
done <"/etc/aws/hosts.conf"
ghostdog74
la source