# Shellcheck : outil sympa pour les BASHers

**URL:** <https://www.debian-fr.org/t/shellcheck-outil-sympa-pour-les-bashers/58623>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 5:52 UTC](https://www.debian-fr.org/t/shellcheck-outil-sympa-pour-les-bashers/58623 "2016-02-21T17:52:34Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![agentsteel](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/97f17d/32.png) [@agentsteel](https://www.debian-fr.org/u/agentsteel)\
**Post date:** [Février 21, 2016, 5:52 UTC](https://www.debian-fr.org/t/shellcheck-outil-sympa-pour-les-bashers/58623/1 "2016-02-21T17:52:34Z")

</div>

> [@](#):
>
> automatically detects problems with sh/bash scripts and commands.

[shellcheck.net](http://www.shellcheck.net)

---

<div class="post-metadata">

**Author:** ![Mimoza](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mimoza/32/3858_2.png) [@Mimoza](https://www.debian-fr.org/u/Mimoza)\
**Post date:** [Février 21, 2016, 5:52 UTC](https://www.debian-fr.org/t/shellcheck-outil-sympa-pour-les-bashers/58623/2 "2016-02-21T17:52:35Z")

</div>

En effet ça peut être utile pour rapidement débugger ses scripts.  
Le même pour plus de shell serait parfait (Ksh, Zsh, …)

---

<div class="post-metadata">

**Author:** ![Niloo](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/n/c37758/32.png) [@Niloo](https://www.debian-fr.org/u/Niloo)\
**Post date:** [Février 21, 2016, 5:52 UTC](https://www.debian-fr.org/t/shellcheck-outil-sympa-pour-les-bashers/58623/3 "2016-02-21T17:52:35Z")

</div>

Outil intéressant, merci pour l’information 😉

---

<div class="post-metadata">

**Author:** ![agentsteel](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/97f17d/32.png) [@agentsteel](https://www.debian-fr.org/u/agentsteel)\
**Post date:** [Février 21, 2016, 5:52 UTC](https://www.debian-fr.org/t/shellcheck-outil-sympa-pour-les-bashers/58623/4 "2016-02-21T17:52:35Z")

</div>

> [@Mimoza](#):
>
> En effet ça peut être utile pour rapidement débugger ses scripts.

et y’a plein d’astuces d’optimisation (ex. utiliser au maximum les fonctionnalités internes de BASH au lieu de lancer des commandes externes, etc…)

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 5:52 UTC](https://www.debian-fr.org/t/shellcheck-outil-sympa-pour-les-bashers/58623/5 "2016-02-21T17:52:37Z")

</div>

Salut,  
Top pour moi qui suis si mauvais… Merci, c’est dans mes favoris!

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 5:52 UTC](https://www.debian-fr.org/t/shellcheck-outil-sympa-pour-les-bashers/58623/6 "2016-02-21T17:52:38Z")

</div>

Je l’ai un peu essayé et il faut y faire gaffe.  
Par exemple il conseil d’utiliser ${var%/\*} à la place de dirname.

`~ % var=/home/toto
~ % echo "'${var%/*}' '$(dirname $var)'"
'/home' '/home'
~ % var=/home/
~ % echo "'${var%/*}' '$(dirname $var)'"
'/home' '/'
~ % var=/home
~ % echo "'${var%/*}' '$(dirname $var)'"
'' '/'
~ % var='..'
~ % echo "'${var%/*}' '$(dirname $var)'"`  
Mais ça donne aussi de bons conseils et c’est rigolo.

---

<div class="post-metadata">

**Author:** ![agentsteel](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/97f17d/32.png) [@agentsteel](https://www.debian-fr.org/u/agentsteel)\
**Post date:** [Février 21, 2016, 5:52 UTC](https://www.debian-fr.org/t/shellcheck-outil-sympa-pour-les-bashers/58623/7 "2016-02-21T17:52:39Z")

</div>

oui faut faire gaffe (encore plus pour un noob comme moi)

pour une ligne telle que :

```auto
messagesubject_notags=$(echo "$messagesubject" | sed 's/<[^>]*>//g')
```

il préconise [quote]See if you can use ${variable//search/replace} instead.[/quote]

et moi j’ai sauté dedans ![:075](https://www.debian-fr.org/uploads/default/original/1X/660d70f9421e915a2561756e6d9f245d4f609347.gif "dequoi") :

```auto
messagesubject_notags=${messagesubject//'<[^>]*>'/}
```

mais ça ne fonctionne pas ![:033](https://www.debian-fr.org/uploads/default/original/1X/42cd8bd0447ecac24cdff1e26fa990a5c8442791.gif "petard")

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 5:52 UTC](https://www.debian-fr.org/t/shellcheck-outil-sympa-pour-les-bashers/58623/8 "2016-02-21T17:52:43Z")

</div>

En l’occurrence, si :

```auto

```

---

<div class="post-metadata">

**Author:** ![agentsteel](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/97f17d/32.png) [@agentsteel](https://www.debian-fr.org/u/agentsteel)\
**Post date:** [Février 21, 2016, 5:52 UTC](https://www.debian-fr.org/t/shellcheck-outil-sympa-pour-les-bashers/58623/9 "2016-02-21T17:52:44Z")

</div>

pourtant si je tape ça dans un shell, je n’ai pas le résultat escompté :

`export hello="<tag>hello</tag>"
echo ${hello//<[^>]*>/}`

me renvoie une ligne vide, au lieu du “hello” attendu, alors que

```auto

```

me renvoie bien la valeur attendue

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Février 21, 2016, 6:22 UTC](https://www.debian-fr.org/t/shellcheck-outil-sympa-pour-les-bashers/58623/10 "2016-02-21T18:22:11Z")

</div>

Formidable outil, bien sur à ne pas prendre pour Dieu !

Sous réserve de réfléchir, voire de vérifier ce que l’on ne sait pas, il peut devenir un compagnon vraiment agréable, faire gagner du temps de débogage, et me permettre d’améliorer mes plus ou moins mauvais scripts.

Ce n’est qu’un programme, et il peut se tromper.  
exemple:

```auto
5 datelogmax=$(ls -l $logmax | perl -lane 'print "$F[5] $F[6] $F[7]"')
                ^––
         Use find instead of ls to better handle non-alphanumeric filenames.
                                           ^––
         Expressions don't expand in single quotes, use double quotes for that.
```

Ici il ignore que les apostrophes (simple quote) qui encadrent l’expression perl est justement mise pour échapper à l’interprétation du shell.  
Mais c’est un mauvais procès, puisque j’introduit du Perl là où je demande un contrôle de bash.

Je découvre, merci agentsteel

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 8:13 UTC](https://www.debian-fr.org/t/shellcheck-outil-sympa-pour-les-bashers/58623/11 "2016-02-21T20:13:51Z")

</div>

[quote=“agentsteel”]pourtant si je tape ça dans un shell, je n’ai pas le résultat escompté :

`export hello="<tag>hello</tag>"
echo ${hello//<[^>]*>/}`

me renvoie une ligne vide, au lieu du “hello” attendu, alors que

```auto

```

me renvoie bien la valeur attendue[/quote]  
J’avais pas vu ta réponse… Mieux vaut tard que gz, non ?  
Voici comment on peut faire :

`shopt extglob
echo ${hello//<+([^>])>/}`  
Pour voir la doc la dessus c’est dans la man de bash dans la section [mono]« Pattern Matching »[/mono].

---

<div class="post-metadata">

**Author:** ![agentsteel](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/97f17d/32.png) [@agentsteel](https://www.debian-fr.org/u/agentsteel)\
**Post date:** [Février 21, 2016, 8:13 UTC](https://www.debian-fr.org/t/shellcheck-outil-sympa-pour-les-bashers/58623/12 "2016-02-21T20:13:52Z")

</div>

ça va encore me servir ![:023](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "OK")

merci

PS : [quote]mieux vaut TAR que GZ[/quote]  
elle est bonne ![:033](https://www.debian-fr.org/uploads/default/original/1X/42cd8bd0447ecac24cdff1e26fa990a5c8442791.gif "petard")
