Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Expressions régulières
  3. bash, l'interpréteur de commandes de GNU
Extrait - Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition)
Extraits du livre
Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition) Revenir à la page d'achat du livre

bash, l'interpréteur de commandes de GNU

Description 

Le shell bash est l’interpréteur de commandes du système d’exploitation GNU de la FSF (Free Software Foundation). Il a été publié en 1988 par Brian Fox et est compatible avec le Bourne shell (sh) auquel il apporte de nombreuses fonctionnalités telles que l’historique des commandes exécutées, l’édition de la ligne de commande, les fonctions et les aliases, le calcul arithmétique sur les entiers en différentes bases, la gestion des tableaux et des hashes, les syntaxes étendues... Son nom est l’acronyme de Bourne Again Shell. Comme le Bourne shell, il manipule les modèles (patterns, globbing), mais il y a ajouté des extensions sous la forme de modèles étendus (extended globbing) qui viennent compléter une syntaxe très élémentaire. Il apporte également de nombreux éléments, tels que des opérateurs permettant de comparer des chaînes de caractères à des patterns ou à des expressions régulières.

La description de l’interprétation des modèles de bash peut être affichée grâce à la commande :

$ man 7 glob 

Les modèles étendus 

1. Les nouvelles syntaxes 

Nous avons vu dans le chapitre consacré aux shells que les métacaractères utilisés par les modèles sont les suivants :

  • *, qui désigne une suite de 0 à n caractères ;

  • ?, qui désigne un caractère quelconque, à l’exception d’un . en début de chaîne ;

  • [ et ], qui servent à désigner un caractère faisant partie d’une liste.

À ces quelques caractères particuliers, bash ajoute les nouvelles syntaxes suivantes, dans lesquelles les caractères figurant devant les parenthèses doivent être considérés comme des indicateurs de nombre d’occurrences ou de présence des modèles spécifiés entre parenthèses.

Syntaxe

  • ?(pattern-list), qui correspond à zéro ou un des modèles spécifiés dans pattern-list.

  • *(pattern-list), qui correspond à N modèles spécifiés dans pattern-list, N étant supérieur ou égal à 0.

  • +(pattern-list), qui correspond à N modèles spécifiés dans pattern-list, N étant supérieur ou égal à 1.

  • @(pattern-list), qui correspond à exactement un des modèles spécifiés dans pattern-list.

  • !(pattern-list), qui correspond à tout sauf l’un des modèles spécifiés dans pattern-list.

Exemple

Pour lister les fichiers dont les noms se terminent par _lex.l ou _yacc.y dans tous les sous-répertoires du répertoire courant, on pourra utiliser la commande :

$ ls -l */*_@(lex.l|yacc.y) 

2. Les options de configuration 

L’option -f , équivalente à noglob, désactive l’interprétation des modèles. Tous les métacaractères vus précédemment sont alors traités comme de simples caractères sans signification particulière. Sa désactivation restaure l’interprétation des modèles.

Syntaxe

  • L’activation de cette option est effectuée par l’une des instructions suivantes :

$ set -f  
$ set -o noglob 
  • Inversement, sa désactivation est effectuée par l’une des instructions suivantes :

$ set +f  ...

Les opérateurs de comparaison 

1. Les opérateurs liés aux modèles 

En plus de la syntaxe [] du Bourne shell qui évalue la valeur booléenne d’une expression, bash ajoute la syntaxe [[]] qui apporte, entre autres, une signification particulière aux opérateurs de comparaison = (et son équivalent ==) et !=. Dans ce contexte, la valeur à la droite de l’opérateur peut être un modèle étendu (au sens extended pattern), et il ne doit pas être placé entre quotes sous peine d’être traité comme une simple chaîne de caractères. Ces opérateurs permettent respectivement de tester si une chaîne correspond (=) ou ne correspond pas (!=) à un modèle spécifié.

Syntaxe

  • [[ chaîne =pattern]]

  • [[ chaîne ==pattern]]

  • [[ chaîne !=pattern]]

Exemple 1

$ [[ 'program.c' = *.c ]]; echo $? 

affiche 0 (VRAI) car la chaîne correspond au modèle (les simples quotes sont supprimées).

Exemple 2

vimfile=/usr/share/vim/vim82/colors/darkblue.vim  
$ [[ "$vimfile" != /u??/s*/vim/vim8?/col*/*blue.vim ]]  
$ echo $? 

affiche 1 (FAUX) car le contenu de la variable correspond au modèle.

Exemple 3

$ [[ '/tmp/abx.c' == /tmp/[a-z][a-z][a-m]* ]]; echo $? 

affiche 1 (FAUX) car le contenu de la variable ne correspond...