# \[Bash - if\] Explication de fonctionnement

**URL:** <https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368>\
**Category:** Programmation\
**Tags:** bash\
**Created:** [Novembre 5, 2022, 12:03 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368 "2022-11-05T12:03:58Z")\
**Posts on this page:** 19\
**Page:** 1

<div class="post-metadata">

**Author:** ![a\_O](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/ad7895/32.png) [@a\_O](https://www.debian-fr.org/u/a_O)\
**Post date:** [Novembre 5, 2022, 12:03 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/1 "2022-11-05T12:03:58Z")

</div>

Bonjour à toutes et à tous,

J’ai fait une petite boucle très simple qui ne fonctionnait pas :

```
    if [$i = $db] && [$i = information_schema] && [$i = performance_schema]
    then
           echo "passe"
    else 
             sudo mysqldump -d $i > $DIR_BCK/$i-`date +%d%m%Y`
    fi

```

je me suis cassé la tête jusqu’à intervertir la condition

```
if [$i != $db] && [$i != information_schema] && [$i != performance_schema]
    then
    sudo mysqldump -d $i > $DIR_BCK/$i-`date +%d%m%Y`
else 
    echo "pass"
fi

```

et ça marche… mais pourquoi ?? 🤔

merci pour votre réponse et bonne journée !

---

<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 5, 2022, 12:41 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/2 "2022-11-05T12:41:37Z")

</div>

> [@a\_O](#):
>
> et ça marche… mais pourquoi ??

Parce-que les conditions ne sont pas remplies, jusqu’à preuve du contraire.

Exemple:  
`[$i = information_schema] && [$i = performance_schema]`

Impossible.

---

<div class="post-metadata">

**Author:** ![dindoun](https://www.debian-fr.org/user_avatar/www.debian-fr.org/dindoun/32/4281_2.png) [@dindoun](https://www.debian-fr.org/u/dindoun)\
**Post date:** [Novembre 5, 2022, 1:40 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/3 "2022-11-05T13:40:48Z")

</div>

salut  
déjà nous dire ce que tu veux qu’elle fasse.  
ensuite le la comparaison se fait avec == pas =  
de plus on ne peut pas avoir $i égal à trois trucs différents ( il faudrait un OU ) : `if [$i == $db] || [$i == information_schema] || [$i == performance_schema]`  
metrte des guillemets autour de $i : `"$i"`

---

<div class="post-metadata">

**Author:** ![a\_O](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/ad7895/32.png) [@a\_O](https://www.debian-fr.org/u/a_O)\
**Post date:** [Novembre 5, 2022, 4:30 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/4 "2022-11-05T16:30:32Z")

</div>

Merci pour vos réponses, je suis tout à fait d’accord avec ce que vous avez noté.

ce genre de _kernel panic cérébral_ me revient lorsque je refais du bash après de longs mois d’inactivité.

Navré du désagrément, tout est «&nbsp;normal&nbsp;».

```auto
[$i != $db] && [$i != information_schema] && [$i != performance_schema]

```

est largement satisfaite, le but ayant été d’exclure les bases susnommées, de sauvegarder le reste, ce qui est un succès.

Merci à vous et bonne soirée !

---

<div class="post-metadata">

**Author:** ![a\_O](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/ad7895/32.png) [@a\_O](https://www.debian-fr.org/u/a_O)\
**Post date:** [Novembre 5, 2022, 4:35 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/5 "2022-11-05T16:35:41Z")

</div>

Merci Dindoun,

ce sont les syntaxes comparatives qui me crées un brain storm. J’avais eu une erreur de syntaxe avec le if, que je ne comprends toujours pas ; ça a été résolu avec la ligne que tu lis au-dessus (oui, il n y a qu’un seul = … )  
Je n’arrive pas à comprendre la distnction avec d’autres sites qui proposent le == et d’autres le = mais… ça marche. 🤯

Merci et bonne soirée !

---

<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 5, 2022, 5:02 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/6 "2022-11-05T17:02:47Z")

</div>

La syntaxe entre `[` ou `[[`, et `=` ou `==` diffère selon que exécutes un script en **d** ash ou **b** ash.  
Le dash correspond à **sh** dans Debian, dash étant le script système de base par défaut.

```auto
readlink /usr/bin/sh
dash

```

La syntaxe en dash sera plus portable «&nbsp;[,=&nbsp;», mais n’a pas la puissance de la syntaxe de bash5.

---

<div class="post-metadata">

**Author:** ![a\_O](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/ad7895/32.png) [@a\_O](https://www.debian-fr.org/u/a_O)\
**Post date:** [Novembre 5, 2022, 5:33 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/7 "2022-11-05T17:33:43Z")

</div>

Merci pour ces explications O\_o

D’où l’importance de shabang.

Bonne soirée !

---

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Novembre 6, 2022, 10:03 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/8 "2022-11-06T10:03:01Z")

</div>

> [@a\_O](#):
>
> J’ai fait une petite boucle très simple qui ne fonctionnait pas :
> 
> ```plaintext
> if [$i = $db] && [$i = information_schema] && [$i = performance_schema]
> then
> echo "passe"
> else 
> sudo mysqldump -d $i > $DIR_BCK/$i-`date +%d%m%Y`
> fi
> 
> ```
> 
> je me suis cassé la tête jusqu’à intervertir la condition
> 
> ```plaintext
> if [$i != $db] && [$i != information_schema] && [$i != performance_schema]
> then
> sudo mysqldump -d $i > $DIR_BCK/$i-`date +%d%m%Y`
> else 
> echo "pass"
> fi
> 
> ```
> 
> et ça marche… mais pourquoi ?? 🤔

C’est une simple question de logique :

```auto
!a AND !b AND !c ≠ !(a AND b AND c)

```

Là, tu n’as pas « interverti la condition », tu l’as juste modifiée.  
C’est pour ça et aussi parce que

> [@Verner](#):
>
> les conditions ne sont pas remplies, jusqu’à preuve du contraire.

---

<div class="post-metadata">

**Author:** ![JustModeste](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/d9b06d/32.png) [@JustModeste](https://www.debian-fr.org/u/JustModeste)\
**Post date:** [Novembre 6, 2022, 10:09 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/9 "2022-11-06T10:09:58Z")

</div>

ça marche parce que

```auto
if [$i = $db] && [$i = information_schema] && [$i = performance_schema]

```

n’est pas la négation de

```auto
if [$i != $db] && [$i != information_schema] && [$i != performance_schema]

```

En logique, la négation de (P et Q) est non(P) OU non(Q).

donc ici la première condition aurez dû être :

```auto
if [$i = $db] || [$i = information_schema] || [$i = performance_schema]

```

D’ailleurs, $i ne peut pas avoir 3 valeurs différentes en même temps 😉 (Ou alors peut-être en Informatique Quantique…)

Cordialement,

---

<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 6, 2022, 10:33 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/10 "2022-11-06T10:33:38Z")

</div>

C’est comme dans «&nbsp;être **ou** ne pas être&nbsp;». On ne peut «&nbsp;être **et** ne pas être&nbsp;», je pense que a\_O a compris…  
Le plus intéressant est la différence de syntaxe entre dash et bash, qui n’est pas évidente et parfois confuse, selon les versions de bash.

Sinon, en plus compact, en bash:

```auto
[[$i =~ $db|information_schema|performance_schema]] && echo OK || echo KO

```

i=x ; db=x =\> OK  
i=x ; db=y =\> KO

---

<div class="post-metadata">

**Author:** ![a\_O](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/ad7895/32.png) [@a\_O](https://www.debian-fr.org/u/a_O)\
**Post date:** [Novembre 6, 2022, 10:38 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/11 "2022-11-06T10:38:20Z")

</div>

Bonjour,

Merci pour vos réponses !

Effectivement, nous ne sommes pas (encore) en informatique Quantique et il ne s’agit pas (encore) de chat mort ET OU vivants 😛

J’avais eu un moment d’absence, il s’agit ici d’un ET inclusif et non d’exclusion…

Merci encore et bonne journée !

---

<div class="post-metadata">

**Author:** ![a\_O](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/ad7895/32.png) [@a\_O](https://www.debian-fr.org/u/a_O)\
**Post date:** [Novembre 6, 2022, 10:43 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/12 "2022-11-06T10:43:44Z")

</div>

Oui @Verner , c’est cela qui est intéressant et que j’ignorais en grande parti.  
Je savais que parfois il fallait spécifier le shell /bin/bash à la place de /bin/sh mais sans forcément réellement savoir pourquoi… toute cette histoire de syntaxe est beaucoup plus confuse qu’on ne le pense ; si on ignore les réelles différences…

D’autant que je viens d’apprendre que Bash n’est plus POSIX ??? O\_o

as-tu un lien explicatif et plus ou moins exhaustif là-dessus ?

Merci et bonne journée 🙂

---

<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 6, 2022, 10:57 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/13 "2022-11-06T10:57:09Z")

</div>

> [@a\_O](#):
>
> D’autant que je viens d’apprendre que Bash n’est plus POSIX ???

Par défaut non, mais pourtant…  
[Mode POSIX de Bash - Démarrer Bash avec --posixoption de ligne de commande](https://runebook.dev/fr/docs/bash/bash-posix-mode)

Pour moi POSIX veut dire ‹&nbsp;portable&nbsp;›, sans ambiguïté pour le système.  
La référence script POSIX pour Debian est le dash.  
Si ça marche avec dash, on est sûr qu’il n’y pas d’embrouilles, et que bash ou zsh comprendront la syntaxe.  
Pour des scripts plus compliqués, bash est quand-même plus confortable et plus puissant.

Pour être franc, c’est un sujet hyper prise de tête. Il y a une tonne de documentations bash, qui créent la confusion puisqu’il est facile de trouver des contradictions d’une version à l’autre, selon l’ancienneté des versions.  
Je suis toujours très prudent sur le sujet…

---

<div class="post-metadata">

**Author:** ![a\_O](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/ad7895/32.png) [@a\_O](https://www.debian-fr.org/u/a_O)\
**Post date:** [Novembre 6, 2022, 11:20 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/14 "2022-11-06T11:20:22Z")

</div>

Merci @Verner pour ces précisions, je comprends beaucoup mieux certains problèmes que j’ai pu rencontrer dans le passé.  
Et surtout sur, parfois, mon incompréhension et mon désespoir sur le «&nbsp;pourquoi cette syntaxe et pas l’autre qui marchait pourtant ??&nbsp;».

Merci pour le lie qui parait être une mine de code 😃 et bon dimanche 🙂

---

<div class="post-metadata">

**Author:** ![littlejohn75](https://www.debian-fr.org/user_avatar/www.debian-fr.org/littlejohn75/32/3840_2.png) [@littlejohn75](https://www.debian-fr.org/u/littlejohn75)\
**Post date:** [Novembre 6, 2022, 4:40 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/15 "2022-11-06T16:40:32Z")

</div>

> [@a\_O](#):
>
> je me suis cassé la tête jusqu’à intervertir la condition
> 
> ```auto
> if [$i != $db] && [$i != information_schema] && [$i != performance_schema]
> then
> sudo mysqldump -d $i > $DIR_BCK/$i-`date +%d%m%Y`
> else 
> echo "pass"
> fi
> 
> ```
> 
> et ça marche… mais pourquoi ?? 🤔

ça marche peut-être, mais c’est toujours aussi casse-tête.  
Pour la simple raison que vous n’avez pas choisi la syntaxe adaptée. Dans votre _cas_ vous voulez faire un traitement différencié pour un certain nombre de cas possibles selon la valeur d’une variable `$i` (que vous deviez mettre entre " ).

La bonne structure syntaxique dans votre cas est _case_ :

```bash
case "$i" in
   sdb|information_schema|performance_schema) echo "passe"
      ;;
   *) sudo mysqldump -d "$i" > "$DIR_BCK"/"$i"-"$(date +%d%m%Y)"
     ;;
esac

```

(en ajoutant avec grande difficulté des quotes doubles, le widget d’édition et ma vue foireuse, cela fait deux ).  
S’il y a plusieurs alternatives pour une variable donnée, utilisez _case_ et surtout raisonnez en logique _positive_.

Cordialement,  
Regards,  
Mit freundlichen Grüßen,  
مع تحياتي الخالصة

* * *

F. Petitjean  
Ingénieur civil du Génie Maritime.

« Ce que l’on conçoit bien s’énonce clairement,  
Et les mots pour le dire arrivent aisément. »  
Boileau De L’Art poétique (Chant I)

---

<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 6, 2022, 6:15 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/16 "2022-11-06T18:15:37Z")

</div>

Ou l’art de compliquer inutilement un problème déjà résolu.  
‹&nbsp;case&nbsp;› ne présente pas d’intérêt dans ce cas présent puisque c’est un test binaire: OK ou pas OK.  
‹&nbsp;case&nbsp;› est adapté aux cas multi-options (\> 2).  
‹&nbsp;case&nbsp;› n’est pas posix, donc inutile pour un simple test système de préférence compatible dash.

---

<div class="post-metadata">

**Author:** ![littlejohn75](https://www.debian-fr.org/user_avatar/www.debian-fr.org/littlejohn75/32/3840_2.png) [@littlejohn75](https://www.debian-fr.org/u/littlejohn75)\
**Post date:** [Novembre 8, 2022, 4:41 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/17 "2022-11-08T16:41:07Z")

</div>

> [@Verner](#):
>
> ‹ case › ne présente pas d’intérêt dans ce cas présent puisque c’est un test binaire: OK ou pas OK.

I be to differ  
Dans le cas présent, le test binaire (OK ou pas OKà est si compliqué ç formuler que @a_O s’est initialement planté et a été obligé de demander de l’aide.

> [@Verner](#):
>
> ‹ case › est adapté aux cas multi-options (\> 2).

Comment appelez-vous les différentes alternatives reliées par un ou logique symbolisé par le symbole | dans l’expression régulière du `case` ? ce n’est pas "multi-options’ pour vous ?

> [@Verner](#):
>
> ‹ case › n’est pas posix, donc inutile pour un simple test système de préférence compatible dash.

Merci de l’avoir précisé. Je ne le savais pas.

Cordialement,  
Regards,  
Mit freundlichen Grüßen,  
مع تحياتي الخالصة

* * *

F. Petitjean  
Ingénieur civil du Génie Maritime.

« Je préfère le vin d’ici à l’au-delà »  
Pierre Dac

---

<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 8, 2022, 6:15 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/18 "2022-11-08T18:15:38Z")

</div>

Ce que j’appelle une liste ‹&nbsp;multi-options&nbsp;› ‹&nbsp;\>2&nbsp;›, c’est ça.

```auto
case "$i" in 
   x|y) echo A ;;
   z) echo B ;;
   v) echo C ;;
   t) echo D ;;
   # etc etc...
esac

```

Sinon, ou peut aussi faire avec une liste de if et de ‹&nbsp; **elif** &nbsp;›, qui n’aurait pas non plus d’intérêt pour un simple test OK ou pas OK.

Donc, en **non posix** et déjà cité, ça c’était pas plus simple et plus compact ?

```auto
[[$i =~ $db|information_schema|performance_schema]] 

```

C’est un test regex non posix qui est exactement le même que `'case "$i" in sdb|information_schema|performance_schema)`’

case n’apporte rien de plus ici.  
Pas besoin de 50 messages sur des sujets aussi simples quand-même, la difficulté principale étant de comprendre la différence entre dash et bash, posix et non posix.

---

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Novembre 9, 2022, 6:56 UTC](https://www.debian-fr.org/t/bash-if-explication-de-fonctionnement/87368/19 "2022-11-09T06:56:56Z")

</div>

A fermé ce sujet (le Novembre 9, 2022, 6:56 UTC)


