IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Introduction à la programmation en Bash


précédentsommairesuivant

IV. 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 nom commence par le caractère . 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 :

 
Sélectionnez
$ pwd
/home/sanchis/generique
$ ls -l
total 0
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 1
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 a
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 _a
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 A
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 à
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 ami
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 an
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 Arbre
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 e
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 é
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 émirat
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 En
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 état
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 minuit
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 zaza
-rw-r--r-- 1 sanchis users                       0 nov    10      2004 Zoulou
$

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 :

 
Sélectionnez
$ LC_ALL=C       ls -l
total 0
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 1
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 A
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 Arbre
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 En
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 Zoulou
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 _a
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 a
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 ami
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 an
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 e
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 minuit
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 zaza
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 ?
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 ?
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 ?mirat
-rw-r--r--       1   sanchis     users    0   Nov    10  2004 ?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.

IV-1. Caractères génériques

Les caractères génériques du shell sont : * ? []

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 .

 
Sélectionnez
$ 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
notify                  off
nounset                 off
onecmd                  off
physical                off
posix                   off
privileged              off
verbose                 off
vi                      off
xtrace                  off
$
  • Le caractère générique * désigne n'importe quelle suite de caractères, même la chaîne vide
 
Sélectionnez
$ 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.

 
Sélectionnez
$ ls -l a*
-rw-r--r--          1 sanchis    users               0 nov 10 11:41 a
-rw-r--r--          1 sanchis    users               0 nov 10 11:41 ami
-rw-r--r--          1 sanchis    users               0 nov 10 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.

 
Sélectionnez
$ echo *a*                        => noms des entrées contenant un caractère a
a _a ami an émirat état zaza
$

quand aucune entrée ne correspond au modèle fourni, les caractères et expressions génériques ne sont pas interprétés.

 
Sélectionnez
$ echo Z*t
Z*t
$
  • Le caractère générique ? désigne un et un seul caractère
 
Sélectionnez
$ echo ?         => noms d’entrées composés d’un seul caractère
1aAàeé
$ echo ?n
an En
$

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

 
Sélectionnez
$ echo ?mi*
ami émirat
$

Exercice :
Ecrire un modèle permettant d'afficher le nom des entrées dont le 2ème caractère est un a.

Exercice :
Ecrire un modèle permettant d'afficher le nom des entrées dont le 1er caractère est un a suivi par 2 caractères quelconques.

  • 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 []

 
Sélectionnez
$ ls -l [ame]
-rw-r--r--        1 sanchis     users               0 nov 10 11:41 a
-rw-r--r--        1 sanchis     users               0 nov 10 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 - .

 
Sélectionnez
$  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).

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

 
Sélectionnez
$  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 :

 
Sélectionnez
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 [.

 
Sélectionnez
$ 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:]]
1A
$ echo    [![:upper:]]*
1 a _a    à ami an e é émirat état minuit zaza
$ echo    [![:upper:]]*[!at]
ami an
$

IV-2. 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.

 
Sélectionnez
$ 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
failglob		off
force_fignore		on
gnu_errfmt		off
histappend		off
histreedit		off
histverify		off
hostcomplete		on
huponexit		off
interactive_comments	on
lithist			off
login_shell		on
mailwarn		off
no_empty_cmd_completion	off
nocaseglob		off
nocasematch		off
nullglob		off
progcomp		on
promptvars		on
restricted_shell	off
shift_verbose		off
sourcepath		on
xpg_echo		off
$

Pour activer une option de la commande interne shopt on utilise la commande : shopt –s opt
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
 
Sélectionnez
$ 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
$

Exercice :
Ecrire un modèle correspondant aux noms d'entrées ne comportant pas de caractère a

Si l’on souhaite utiliser les expressions génériques dans un fichier shell, on y inclura préalablement la commande shopt –s extglob

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 set : set –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


précédentsommairesuivant

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.