Vous êtes ici :
Accueil Cours Administration Système La programmation Système avec Shell Les caractères et expressions génériques

La programmation Système avec Shell : Les caractères et expressions génériques

Les caractères et expressions génériques sont issus d'un mécanisme plus général appelé expressions rationnelles  (regular expressions) ou  expressions régulières. Ces caractères et expressions sont utilisés pour spécifier un modèle de noms d'entrées. Ce modèle est ensuite interprété par le shell pour créer une liste triée de noms d'entrées. Par défaut, le shell traite uniquement les entrées non cachées du répertoire courant ; cela signifie que les entrées dont le
rnnom commence par le caractère . (point) sont ignorées. Pour illustrer l’utilisation des caractères et expressions génériques, on utilisera un répertoire appelé generique contenant les 16 entrées suivantes :
 

$ pwd
/home/tony/generique
$
$ ls -l
total 0
-rw-r--r-- 1 tony users 0 oct 26  2015 1
-rw-r--r-- 1 tony users 0 oct 26  2015 a
-rw-r--r-- 1 tony users 0 oct 26  2015 _a
-rw-r--r-- 1 tony users 0 oct 26  2015 A
-rw-r--r-- 1 tony users 0 oct 26  2015 à
-rw-r--r-- 1 tony users 0 oct 26  2015 ami
-rw-r--r-- 1 tony users 0 oct 26  2015 an
-rw-r--r-- 1 tony users 0 oct 26  2015 Arbre
-rw-r--r-- 1 tony users 0 oct 26  2015 e
-rw-r--r-- 1 tony users 0 oct 26  2015 é
-rw-r--r-- 1 tony users 0 oct 26  2015 émirat
-rw-r--r-- 1 tony users 0 oct 26  2015 En
-rw-r--r-- 1 tony users 0 oct 26  2015 état
-rw-r--r-- 1 tony users 0 oct 26  2015 minuit
-rw-r--r-- 1 tony users 0 oct 26  2015 zaza
-rw-r--r-- 1 tony users 0 oct 26  2015 Zoulou
$ 

 
Remarque :

La valeur des paramètres régionaux influe grandement sur la présentation et la méthode de tri des noms  d’entrées. Si on utilise la locale standard, on obtient l’affichage suivant :
 
$ LC_ALL=C ls -l
total 0

-rw-r--r-- 1 tony users 0 Oct 10  2015 1
-rw-r--r-- 1 tony users 0 Oct 10  2015 A
-rw-r--r-- 1 tony users 0 Oct 10  2015 Arbre
-rw-r--r-- 1 tony users 0 Oct 10  2015 En
-rw-r--r-- 1 tony users 0 Oct 10  2015 Zoulou
-rw-r--r-- 1 tony users 0 Oct 10  2015 _a
-rw-r--r-- 1 tony users 0 Oct 10  2015 a
-rw-r--r-- 1 tony users 0 Oct 10  2015 ami
-rw-r--r-- 1 tony users 0 Oct 10  2015 an
-rw-r--r-- 1 tony users 0 Oct 10  2015 e
-rw-r--r-- 1 tony users 0 Oct 10  2015 minuit
-rw-r--r-- 1 tony users 0 Oct 10  2015 zaza
-rw-r--r-- 1 tony users 0 Oct 10  2015 ?
-rw-r--r-- 1 tony users 0 Oct 10  2015 ?
-rw-r--r-- 1 tony users 0 Oct 10  2015 ?mirat
-rw-r--r-- 1 tony users 0 Oct 10  2015 ?tat
$

On s’aperçoit  que l’affichage des noms d’entrées contenant des caractères accentués est altéré. La raison de cela  est que seuls les 7 premiers bits codant les caractères sont interprétés en locale standard. La locale précédente  utilise un codage des caractères sur 8 bits. 

 

Les caractères génériques  

 

Les caractères génériques du shell sont :    *     ?     []
 
Remarque :  il ne faut pas confondre la syntaxe []  du méta-langage et les caractères génériques [] du shell.
 
Pour que  bash interprète les caractères génériques, il est nécessaire que l'option  noglob  de la commande interne set soit à l'état off. Pour connaître l'état des différentes options de la commande interne set, on utilise la commande set  –o .

 

$ set –o
allexport       off
braceexpand     on
emacs           on
errexit         off
hashall         on
histexpand      on
history         on
ignoreeof       off
interactive-comments on
keyword         off
monitor         on
noclobber       off
noexec          off
noglob          off
nolog           off
...
$

 

  •  Le caractère générique * désigne n'importe quelle suite de caractères,  même la  chaîne vide

 

Exemple : 

$ echo *
1 a _a A à ami an Arbre e é émirat En état minuit zaza Zoulou
$  
 
Tous les noms d'entrées sont affichés, triés.
 
Exemple : 

$ ls -l a*

-rw-r--r--    1 tony  users           0 Oct 26 11:41 a
-rw-r--r--    1 tony  users           0 Oct 26 11:41 ami
-rw-r--r--    1 tony  users           0 Oct 26 11:41 an

$
 

La notation a* désigne toutes les entrées du répertoire courant dont le nom commence par la lettre a. Par conséquent, dans la commande ls  –l  a*  le shell remplace la chaîne  a*  par la chaîne :  a ami an
En d’autres termes, la commande ls  "ne voit pas" le caractère * puisqu’il est prétraité par le shell.
 
$ echo *a*     => noms des entrées contenant un caractère a
a _a ami an émirat état zaza
$  
 
Attention :  quand aucune entrée ne correspond au modèle fourni, les caractères et expressions génériques ne sont pas interprétés.  
 
   Exemple : 

$ echo Z*t
Z*t
$
 

  • Le caractère générique désigne un et un seul caractère

 

Exemple : 

$ echo ?   => noms d’entrées composés d’un seul caractère
1 a A à e é
$  
$ echo ?n

an En
$  
 
Plusieurs caractères génériques différents peuvent être présents dans un modèle.
 
Exemple : 

$ echo ?mi*
ami émirat
$

 

  • Les caractères génériques [] désignent un seul caractère parmi un groupe de caractères

 

Ce groupe est précisé entre les caractères []. Il peut prendre deux formes : la forme ensemble et la forme intervalle.
 
- Forme ensemble : tous les caractères souhaités sont explicitement mentionnés entre []
 
Exemple : 

$ ls -l [ame]
-rw-r--r--    1 tony  users           0 oct 26 11:41 a
-rw-r--r--    1 tony  users           0 oct 26 11:41 e
$  
$ echo ?[ame]*

_a ami émirat zaza
$  
 
Le modèle [ame] désigne tous les noms d'entrées constitués d'un seul caractère a, m ou e.
 

- Forme intervalle : seules les bornes de l'intervalle sont précisées et séparées par un - .
 
Exemple :   

$ echo *
1 a _a A à ami an Arbre e é émirat En état minuit zaza Zoulou
$
$ echo [a-z]*
   =>  le caractère Z est ignoré
a A à ami an Arbre e é émirat En état minuit zaza
$  
$ echo [A-Z]*   
=>  le caractère a  est ignoré
A à Arbre e é émirat En état minuit zaza Zoulou
$  
 
L’interprétation du modèle  [a-z] est conditionnée par la valeur des paramètres régionaux : cette syntaxe est donc non portable et il est déconseillé  de l’employer car elle peut avoir des effets néfastes lorsqu’elle est utilisée avec la commande unix rm.  Si l'on souhaite désigner une classe de caractères tels que les minuscules ou les majuscules, il est préférable d'utiliser la syntaxe POSIX 1003.2 correspondante. Ce standard définit des classes de caractères sous la forme  [:nom_classe:]
 

 
Des exemples de classes de caractères définies dans ce standard sont :
[:upper:] (majuscules)
[:lower:] (minuscules)
[:digit:] (chiffres, 0 à 9)  
[:alnum:] (caractères alphanumériques).
 
Attention :  pour désigner n'importe quel caractère d'une classe, par exemple les minuscules, on place la classe entre les caractères génériques [].
 
Exemple : 

$ echo [[:lower:]]  => noms d'entrées constitués d'une seule minuscule  
a à e é
$  
$ echo [[:upper:]]*
A Arbre En Zoulou
$
 
Pour afficher les noms d'entrées commençant par une majuscule ou le caractère a :  

$ echo [[:upper:]a]*   
 
Il est possible de mentionner un caractère ne devant pas figurer dans un groupe de caractères. Il suffit de placer le caractère ! juste après le caractère [.
 

Exemple :  

$ echo ?[!n]*   =>  noms d'entrées ne comportant pas le caractère n en 2ème  position
_a ami Arbre émirat état minuit zaza Zoulou
$
$ echo [![:lower:]]
1 A
$  
$ echo [![:upper:]]*   

1 a _a à ami an e é émirat état minuit zaza
$  
$ echo [![:upper:]]*[!at]

ami an
$
 

 

Les expressions génériques

 

Pour que bash, interprète les expressions génériques, il est nécessaire que l’option extglob de la commande interne shopt soit activée.
 
$ shopt
cdable_vars     off
cdspell         off
checkhash       off
checkwinsize    on
cmdhist         on
dotglob         off
execfail        off
expand_aliases  on
extdebug        off
extglob         off
extquote        on
...


Pour activer une option de la commande interne shopt on utilise la commande : shopt  –s option Pour activer le traitement des expressions génériques par le shell :   shopt  –s  extglob   
 
Les expressions génériques de bash sont :
 
? (liste_modèles) :  correspond à 0 ou 1 occurrence de chaque modèle
 
* (liste_modèles) :  correspond à 0,1 ou plusieurs occurrences de chaque modèle
 
+ (liste_modèles) :  correspond à au moins 1 occurrence de chaque modèle
 
@ (liste_modèles) :  correspond exactement à 1 occurrence de chaque modèle
 
! (liste_modèles) :  correspond à tout sauf aux modèles mentionnés  
 

Exemple : 

$ echo +([[:lower:]])
bash: syntax error near unexpected token `('
$  
$ shopt -s extglob
$  
$ echo +([[:lower:]])
  => noms constitués que de minuscules
a à ami an e é émirat état minuit zaza
$  
$ echo !(+([[:lower:]]))

1 _a A Arbre En Zoulou
$
 

Si l’on souhaite utiliser les  expressions génériques dans  un fichier shell, on y inclura préalablement la commande shopt –s extglob
 
 
Remarques :
 
-  Outre  extglob,  d’autres options de la commande interne  shopt permettent de modifier la création de la liste des noms  d’entrées. Ces options sont : dotglob, nocaseglob, nullglob,failglob. Par défaut elles sont inactives (off).  
 
-  Pour gérer ses propres options, bash intègre deux commandes, set et shopt.  D’un point de vue pratique,
pour connaître l'état des options de la commande interne setset  –o
pour activer une option  de la commande interne set :   set  –o  option
pour désactiver une option  de la commande interne set :   set  +o  option
pour connaître l'état des options de la commande interne shopt :   shopt
pour activer une option  de la commande interne shopt :    shopt  -s  option
pour désactiver une option  de la commande interne shopt :   shopt  -u  option
 

 




Vous êtes ici :
Accueil Cours Administration Système La programmation Système avec Shell Les caractères et expressions génériques