Grep: valeur de retour en cas d'échec

Bonjour,
je me heurte à un test du type
commande | egrep « une séquence »
Resultat="$?"

pour utiliser « $Resultat » comme argument conditionnel: un test
if [[ "$Resultat" = 0 ]] ;then ...

Ce test fonctionne s’il est réussi ( $? = 0 ), mais pas s’il a échoué: la valeur de retour du test grep échoué est absente alors que je m’attendais à ce qu’elle soit un entier positif, comme beaucoup de commandes.

Si le test est échoué, il renvoie la valeur nulle, mon test [[ « $Résultat » = 0 ]] renvoie vrai, comme si la variable vide/nulle valait zéro.

Mon test est donc nul, puisqu’il de différencie pas valeur nulle (vide) et valeur existante : 0.

Pourtant le man dit le contraire (exception si le paramètre -q / --quiet / ou --silence est passé à grep, ce qui n’est pas le cas de mon script):

EXIT STATUS
       Normally  the  exit status is 0 if a line is selected, 1 if no lines were selected, and 2 if an error occurred.  However, if
       the -q or --quiet or --silent is used and a line is selected, the exit status is 0 even if an error occurred.

et grep --help confirme:

Exit status is 0 if any line (or file if -L) is selected, 1 otherwise;
if any error occurs and -q is not given, the exit status is 2.

Une solution trouvée: l’option -c de grep ne renvoie que le nombre de lignes réussie, y compris 0 pour aucune reconnaissance.
Il suffit donc que j’inverse le test en l’appliquant sur la sortie et non plus sur la valeur de retour de grep.

Heu, fais attention aux tests de variables, je te conseille plutôt ça :
if [[ x"$Resultat" = x0 ]] ;then ...

en fait, pourquoi utiliser une valeur numérique?

Il suffit de tester directement la commande avec if [[ -z "commande | egrep " ]]; then

Bonjour

Ou bien :

if 'commande | egrep "une séquence"'; then 
1 J'aime

Quelques précisions.
D’abord grep comme toute commande a toujours une valeur de retour.
Ensuite les doubles crochets sont inutiles dans ce cas.
Ceci , par exemple, devrait parfaitement fonctionner :

#!/bin/bash
date | egrep "2020t"
Resultat=$?
if [ $Resultat = 0 ]; then echo "succes"; else echo "failed"; fi

Si ton script ne fonctionne pas c’est qu’il y a une erreur dedans (il faudrait voir le script réel) ou qu’il n’est pas interprété par bash (dash ou autre).

Merci à tous pour vos 4 précisions précises et limpides.

les double crochet c est une habitude en fait, quoique les simple vont finir par disparaitre un jour.

le truc c est qu’utiliser une variable intermédiair consomme de la mémoire et du buffer supplémentaire non?

La plus concise = ici la plus lisible

« "commande" » ou ‹ commande › ? :wink:

désolé je ne saisa ps comment faire afficher le alt-gr 7 qui est le contre-quote d’eval.

Bonjour

Pour que les caractères des lignes de commandes
s’affichent dans les messages sans êtres interprétés par le forum,
fait précéder la ou le groupe de lignes de commandes par une ligne
ne contenant que :

```text

et fait suivre la ou le groupe de lignes par une ligne
ne contenant que :

```


Si j’entoure commande par des caractères backslash comme ci-dessous :

`commande`

le retour de la commande (flux STDOUT) remplacera commande
et du coup, rien ne sera transmis par le pipe (|) à l’entrée de la commande grep qui suit.

Cette syntaxe est déconseillée ou obsolète, il faut plutôt utiliser ça :

$(commande)
2 J'aime

Oui,
d’autant que la syntaxe $(commande) est beaucoup plus facile à repérer dans un script
que de minuscules backslashes qui pourraient être facilement confondus avec des apostrophes
à moins de zoomer sur l’écran pour vérifier.

3 J'aime