# \[bash\] Motifs de branchement de case

**URL:** <https://www.debian-fr.org/t/bash-motifs-de-branchement-de-case/53101>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 11:49 UTC](https://www.debian-fr.org/t/bash-motifs-de-branchement-de-case/53101 "2016-02-21T11:49:04Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![ptitdernier](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/p/45deac/32.png) [@ptitdernier](https://www.debian-fr.org/u/ptitdernier)\
**Post date:** [Février 21, 2016, 11:49 UTC](https://www.debian-fr.org/t/bash-motifs-de-branchement-de-case/53101/1 "2016-02-21T11:49:04Z")

</div>

Bonjour

Choisir une option numérique parmi 10 est facile

```auto
case $var in
   .....
   [0-9]) ..... ;;
esac
```

Mais comment faire quand le nombre d’options est supérieur à 10 ?  
Quel motif utiliser ?

Il y a un bon moment que je cherche mais je n’ai pas trouvé.  
Bien sur avec if then elif … ça passe; mais je souhaiterais le faire avec case

---

<div class="post-metadata">

**Author:** ![kna](https://www.debian-fr.org/user_avatar/www.debian-fr.org/kna/32/5623_2.png) [@kna](https://www.debian-fr.org/u/kna)\
**Post date:** [Février 21, 2016, 12:04 UTC](https://www.debian-fr.org/t/bash-motifs-de-branchement-de-case/53101/2 "2016-02-21T12:04:53Z")

</div>

> [@](#):
>
> ```
> If the extglob shell option is enabled using the shopt builtin, several extended pattern matching operators are recognized. In the following description, a pattern-list is a list of one or more patterns
> separated by a |. Composite patterns may be formed using one or more of the following sub-patterns:
> 
> ?(pattern-list)
> Matches zero or one occurrence of the given patterns
> *(pattern-list)
> Matches zero or more occurrences of the given patterns
> +(pattern-list)
> Matches one or more occurrences of the given patterns
> @(pattern-list)
> Matches one of the given patterns
> !(pattern-list)
> Matches anything except one of the given patterns
> 
> ```

(man bash, section « Pathname Expansion »)

En bash, tu peux donc faire, par exemple :

```auto
shopt -s extglob

case $var in
    @(1|2|3|4|5|6|7|8|9|10|11|12)) ... ;; # de 1 à 12
    @(13|14|15|16|17|18|19)) ... ;; # de 13 à 19
    [2-3][0-9]) ... ;; # de 20 à 39
    @(40|41|42)) ... ;; # de 40 à 42
    *) ... ;;
esac
```

Mais ça reste un contournement, case cherche des expressions littérales. Pour faire des comparaisons numériques, l’utilisation de if reste plus appropriée.  
Sauf peut-être avec d’autres shells que bash, mais j’en doute…

---

<div class="post-metadata">

**Author:** ![ptitdernier](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/p/45deac/32.png) [@ptitdernier](https://www.debian-fr.org/u/ptitdernier)\
**Post date:** [Février 21, 2016, 12:04 UTC](https://www.debian-fr.org/t/bash-motifs-de-branchement-de-case/53101/3 "2016-02-21T12:04:54Z")

</div>

merci pour ta réponse ; elle est très claire.  
Je resterai donc sur if then …
