Shellcheck : outil sympa pour les BASHers

shellcheck.net

1 J'aime

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

Outil intéressant, merci pour l’information :wink:

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…)

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

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.

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

pour une ligne telle que :

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 :

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

mais ça ne fonctionne pas :033

En l’occurrence, si :

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

me renvoie bien la valeur attendue

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:

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

[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

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].

ça va encore me servir :023

merci

PS : [quote]mieux vaut TAR que GZ[/quote]
elle est bonne :033