Test sur comparaison de variable en erreur anormalement

Bonjour,

J’ai la variable suivante:

ligne="-a always,exit -F arch=b64 -S creat,open,openat,truncate,ftruncate -F exit=-EACCES -F auid>=1000 -F auid!=unset -k access"

et le motif suivant:

prm="-a always,exit"

Si je fait:

# echo $ligne | grep -E "\\$prm"
-a always,exit -F arch=b64 -S creat,open,openat,truncate,ftruncate -F exit=-EACCES -F auid>=1000 -F auid!=unset -k access

Donc tout est normal.
Mais si je fait un test suivant:

[ -z "`echo $ligne | grep -E "\\$prm"`" ] && echo "NOK" || echo "OK"
NOK

On voit bien que le résultat n’est pas bon. Car je devrait normalement avoir OK vu que le test -z est vrai si la longueur de la chaîne est égale à zéro et que dans la vérification précédente on obtient bien la ligne (avec le pattern en surbrillance).

je n’arrrive pas à comprendre où est l’erreur.

Hello bonsoir,

Me demande pas de détail… A mon humble avis des histoires d’interprétation et d’imbrication entre ``` et ' et ", mais le code ci-dessous semble ok:

#!/bin/bash -e
ligne="-a always,exit -F arch=b64 -S creat,open,openat,truncate,ftruncate -F exit=-EACCES -F  auid>=1000 -F auid!=unset -k access"
prm="-a always,exit"

echo $ligne | grep -E "\\$prm" 
# Résu KO
[ -z "`echo $ligne | grep -E "\\$prm"`" ] && echo "NOK" || echo "OK"

var=$(echo $ligne | grep -E "\\$prm")  
# Résu KO
[ -z "$var" ] && echo "NOK" || echo "OK"

Nan ?

Justement, le résultat est OK pas KO. La chaine « -a always,exit » fait bien partie de $ligne.

J’ai écrit trop vite… :woozy_face:

Si tu valorises la variable var tu n’as pas le résultat que tu attends ?

var=$(echo $ligne | grep -E "\\$prm")  
# Résu OK ==> (pas ko)
[ -z "$var" ] && echo "NOK" || echo "OK"

var n’est pas vide, donc le test -z est KO.
Donc [ -z "$var" ] && echo NOK || echo OK devrait afficher OK et non NOK.

# [ -z "`echo "-a always,exit -F arch=b64 -S creat,open,openat,truncate,ftruncate -F exit=-EACCES -F auid>=1000 -F auid!=unset -k access" | grep -E "\-a always,exit"`" ] && echo "NOK" || echo "OK"
OK

Le problème est lié aux variable et leur interprétation par les quotes.

OK j’ai trouvé, ce sont lers quote qui posent problème:

# [ -z "$(echo $ligne | grep -E "\\$prm")" ] && echo "NOK" || echo "OK"
OK

Bravo, tu as retrouvé ma ligne:

var=$(echo $ligne | grep -E "\\$prm")
[ -z "$var" ] && echo "NOK" || echo "OK"

:wink:

J’ai été induit en erreur par le commentaire ci-dessus :slight_smile:

Pour éviter ce genre de confusion, il faut éliminer les variables superflues.
Le problème n’est pas une histoire de guillemet mais de tiret.

Une variable qui commence par « - » sera interprétée par grep comme une option qui n’existe pas, donc résultat de grep obligatoirement négatif.
Il suffit d’utiliser « -- » en fin d’argument de grep pour séparer les options des arguments, ou utiliser '\-’ au lieu de ‹ - › dans la variable de recherche.
Illustration:

ligne="-a always,exit etc... etc..."
prm="-a always,exit"

grep "$prm"  <<<"$ligne" 
  --> grep : option invalide -- ' '

# test correct
grep -q -- "$prm" <<<"$ligne" && echo NOK || echo OK 
  NOK