# Test sur comparaison de variable en erreur anormalement

**URL:** <https://www.debian-fr.org/t/test-sur-comparaison-de-variable-en-erreur-anormalement/90511>\
**Category:** Programmation\
**Created:** [Novembre 1, 2024, 6:21 UTC](https://www.debian-fr.org/t/test-sur-comparaison-de-variable-en-erreur-anormalement/90511 "2024-11-01T18:21:53Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Novembre 1, 2024, 6:21 UTC](https://www.debian-fr.org/t/test-sur-comparaison-de-variable-en-erreur-anormalement/90511/1 "2024-11-01T18:21:53Z")

</div>

Bonjour,

J’ai la variable suivante:

```auto
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:

```auto
prm="-a always,exit"

```

Si je fait:

```auto
# 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:

```auto
[-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.

---

<div class="post-metadata">

**Author:** ![cram28](https://www.debian-fr.org/user_avatar/www.debian-fr.org/cram28/32/12305_2.png) [@cram28](https://www.debian-fr.org/u/cram28)\
**Post date:** [Novembre 1, 2024, 7:18 UTC](https://www.debian-fr.org/t/test-sur-comparaison-de-variable-en-erreur-anormalement/90511/2 "2024-11-01T19:18:41Z")

</div>

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:

```auto
#!/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 ?

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Novembre 1, 2024, 7:40 UTC](https://www.debian-fr.org/t/test-sur-comparaison-de-variable-en-erreur-anormalement/90511/3 "2024-11-01T19:40:10Z")

</div>

> [@cram28](#):
>
> ```auto
> echo $ligne | grep -E "\\$prm" 
> # Résu KO
> 
> ```

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

---

<div class="post-metadata">

**Author:** ![cram28](https://www.debian-fr.org/user_avatar/www.debian-fr.org/cram28/32/12305_2.png) [@cram28](https://www.debian-fr.org/u/cram28)\
**Post date:** [Novembre 1, 2024, 7:53 UTC](https://www.debian-fr.org/t/test-sur-comparaison-de-variable-en-erreur-anormalement/90511/4 "2024-11-01T19:53:26Z")

</div>

J’ai écrit trop vite… 🥴

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

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

```

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Novembre 1, 2024, 8:00 UTC](https://www.debian-fr.org/t/test-sur-comparaison-de-variable-en-erreur-anormalement/90511/5 "2024-11-01T20:00:35Z")

</div>

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

```auto
# [-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.

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Novembre 1, 2024, 8:03 UTC](https://www.debian-fr.org/t/test-sur-comparaison-de-variable-en-erreur-anormalement/90511/6 "2024-11-01T20:03:47Z")

</div>

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

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

```

---

<div class="post-metadata">

**Author:** ![cram28](https://www.debian-fr.org/user_avatar/www.debian-fr.org/cram28/32/12305_2.png) [@cram28](https://www.debian-fr.org/u/cram28)\
**Post date:** [Novembre 1, 2024, 8:18 UTC](https://www.debian-fr.org/t/test-sur-comparaison-de-variable-en-erreur-anormalement/90511/7 "2024-11-01T20:18:17Z")

</div>

Bravo, tu as retrouvé ma ligne:

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

```

😉

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Novembre 1, 2024, 8:39 UTC](https://www.debian-fr.org/t/test-sur-comparaison-de-variable-en-erreur-anormalement/90511/8 "2024-11-01T20:39:33Z")

</div>

> [@cram28](#):
>
> `# Résu OK ==> (pas ko)`

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

---

<div class="post-metadata">

**Author:** ![Verner](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/34f0e0/32.png) [@Verner](https://www.debian-fr.org/u/Verner)\
**Post date:** [Novembre 4, 2024, 8:03 UTC](https://www.debian-fr.org/t/test-sur-comparaison-de-variable-en-erreur-anormalement/90511/9 "2024-11-04T20:03:41Z")

</div>

> [@cram28](#):
>
> `# Résu OK ==> (pas ko)`

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 «&nbsp;`-`&nbsp;» 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 «&nbsp;`--`&nbsp;» en fin d’argument de grep pour séparer les options des arguments, ou utiliser `'\-`’ au lieu de ‹&nbsp;`-`&nbsp;› dans la variable de recherche.  
Illustration:

```auto
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

```
