TrollabWikibashexpansions

Description

Les expansions de bash sont des fonctionnalités mal connues bien que très puissantes. Elles permettent la plupart du temps à la fois de gagner en rapidité et en simplicité tout en conservant une très bonne lisibilité. De plus la syntaxe particulière permet une compréhension et par la même une reprise plus rapide du code les utilisant.

Expansions

Dépendent de la variable IFS par défaut [[:blank:]] tab, lf, espace (pour la séparation des mots et des éléments de tableau)

Expansion par accolades

{X..Y}          séquence des caractères compris entre X et Y avec incrémentation de +/-1
{X..Y..Z}       séquence des caractères compris entre X et Y avec incrémentation de +/-Z
{0X..Y}         séquence des nombres compris entre X et Y avec zéro initial si besoin incrémentation de +/-1
{0X..Y..Z}      séquence des nombres compris entre X et Y avec zéro initial si besoin incrémentation de +/-Z
cas particulier pour la commande for :
  for i in {0..9}…            définit une opération de boucle, liste générée initialement
  for ((i=0;i<9;i++))…        définit une opération de boucle, test interactif

expansion par tilde

(utile uniquement comme préfixe d'expansion de chemin)

~ le home (dossier perso) $HOME
~XXX le home de XXX
~+ le dossier courant $PWD
~- le dossier précédant $OLDPWD

expansion de paramètres

Base
${VAR}          le contenu de la variable
${#VAR}         la longueur du contenu de la variable
${VAR[*]}       tout le contenu d'un tableau
${VAR[@]}       tout le contenu d'un tableau, éléments quottés
${VAR[n]}       le contenu de l'élément n d'un tableau
${!VAR}         la variable dont le nom est contenu dans la variable
$#      ${#}    retourne le nombre de paramètres
$0      ${0}    retourne le nom de la commande
$n      ${n}    retourne le paramètre n (n > 0)
$*      ${*}    retourne la liste des paramètres
$@      ${@}    retourne la liste des paramètres, éléments quottés
$?      ${?}    retourne le code de sortie de la dernière commande
${!XXX@}        liste des nom des variables commençant par XXX, quottés
${!XXX*}        liste des nom des variables commençant par XXX
${!VAR[*]}      liste des clés d'un tableau
${!VAR[@]}      liste des clés d'un tableau, quottées
${!VAR[n]}      le contenu de la variable dont le nom est contenu dans l'élément n d'un tableau

Expressions régulières

Les Expressions régulières (regex) sont similaires aux motifs Globs mais elles ne peuvent être utilisées que pour la recherche de motifs, pas pour la recherche de noms de fichiers.
Depuis la version 3.0, Bash supporte un nouvel opérateur « =~ » pour le mot clef « [[ ».
Cet opérateur permet de rechercher dans la chaîne qui le précède toutes les occurrences de la chaîne qui le suit.
Si la recherche est fructueuse, [[ retourne avec le code de sortie 0 (“true”). Si la recherche échoue, le code de sortie retourné est 1 (“false”).
Dans le cas ou la syntaxe est incorrecte, [[ abandonne l'opération et retourne le code 2.

Ces expressions régulières utilisent des groupes de capture (parenthèses) et les chaines capturées sont assignées a la variable BASH_REMATCH pour une utilisation ultérieure.

Exemple d'utilisation des regex dans Bash :

langRegex='(..)_(..)'
if [[ $LANG =~ $langRegex ]]
then
    echo "Votre code pays (ISO 3166-1-alpha-2) est ${BASH_REMATCH[2]}."
    echo "Votre code langue (ISO 639-1) est ${BASH_REMATCH[1]}."
else
    echo "Votre locale n'a pas été reconnue"
fi

Chaînes

${VAR:n}        retourne la sous-chaîne commençant au énième caractère (n>0)
${VAR:n:l}      retourne la sous-chaîne commençant au énième caractère (n>0) et de longueur l (l>0) \\
                ou jusqu'au élième caractère avant la fin (l<0)
${VAR:(n)}      retourne la sous-chaîne commençant au énième caractère (n>0) ou au énième caractère avant la fin (n<0)
${VAR:(n):l}    retourne la sous-chaîne commençant au énième caractère (n>0) ou au énième caractère avant la fin (n<0) \\
                et de longueur l (l>0) ou jusqu'au élième caractère avant la fin (l<0)
${VAR: n}       retourne la sous-chaîne commençant au énième caractère (n>0) ou au énième caractère avant la fin (n<0)
${VAR: n:l}     retourne la sous-chaîne commençant au énième caractère (n>0) ou au énième caractère avant la fin (n<0) \\
                et de longueur l (l>0) ou jusqu'au élième caractère avant la fin (l<0)
${VAR#XXX}      retourne le contenu de la variable sans le XXX le plus long du début
${VAR##XXX}     retourne le contenu de la variable sans le XXX le plus court du début
${VAR%XXX}      retourne le contenu de la variable sans le XXX final le plus long
${VAR%%XXX}     retourne le contenu de la variable sans le XXX final le plus court
${VAR/XXX/YYY}  retourne le contenu de la variable avec la première occurrence de XXX remplacée par YYY
${VAR//XXX/YYY} retourne le contenu de la variable avec toutes les occurrence XXX remplacées par YYY
${VAR/#XXX/YYY} retourne le contenu de la variable avec la première occurrence de XXX remplacée par YYY 
${VAR/%XXX/YYY} retourne le contenu de la variable avec la dernière occurrence de XXX remplacée par YYY
${VAR^}         retourne le contenu de la variable Capitalisé en majuscule
${VAR^^}        retourne le contenu de la variable converti en majuscules
${VAR^C}        retourne le contenu de la variable Capitalisé en majuscule si la première lettre est un C
${VAR^^C}       retourne le contenu de la variable avec toutes les occurrences du caractère C converties en majuscules
${VAR,}         retourne le contenu de la variable Capitalisé en minuscule
${VAR,,}        retourne le contenu de la variable converti en minuscules
${VAR,C}        retourne le contenu de la variable Capitalisé en minuscule si la première lettre est un C
${VAR,,C}       retourne le contenu de la variable avec toutes les occurrences du caractère C converties en minuscules

expansion de commande

$(XXX)          exécute la commande XXX
`XXX`           exécute la commande XXX
$(<XXX)         déroute le périphérique de saisie depuis le fichier XXX

expansion numérique

$(())          retourne le résultat du calcul numérique
$((b#…))        retourne (en décimal) le résultat du calcul numérique dans la base b ( avec 2<=b<=64 ).
(())           opération numérique
cas particulier pour la commande for :
  for ((i=0;i<9;i++)) ...      définit une opération de boucle, test interactif
  for i in {0..9} ...          définit une opération de boucle, liste générée initialement

expansion des noms de chemins

Globs classiques

?               n'importe quel caractère
*               n'importe quelle chaîne
**              tous les fichiers et dossiers et sous-dossiers
**/             tous les dossiers
[…]             l'un des caractères spécifiés
[…-…]           l'un des caractères compris entre les caractères spécifiés
[^…]    [!…]    sauf l'un des caractères spécifiés
[-…]            l'un des caractères spécifiés dont le -
[…[::]…] tous les caractères appartenant à la classe en plus de ceux spécifiés
[…[==]…] tous les caractères appartenant à la classe en plus de ceux spécifiés

Globs étendus

@(liste)        l'un des patterns
!(liste)        tout sauf l'un des patterns
?(liste)        aucune ou une seule occurrence des patterns
*(liste)        aucune ou plus occurrences des patterns
+(liste)        une ou plus occurrences des patterns

une liste se compose d'une ou plusieurs chaînes ou d'un ou plusieurs globs séparés par des «|» pour «ou» mais pouvant aussi être concaténés par le «&» pour «et» et groupés par l'utilisation des parenthèses «()» comme pour les regex.

les classes possibles sont

  alnum       Alphabétiques et numériques
  alpha       Alphabétiques
  ascii       Contrôles, ponctuations standard, numériques et alphabétique non accentués
  blank       tab, passage à la ligne, espace
  cntrl       Contrôles
  digit       nombres
  graph       caractères semi graphiques
  lower       minuscules
  print       affichables
  punct       ponctuations
  space       espace et tab
  upper       majuscules
  word        alphabétiques, numériques et _
  xdigit      chiffres hexadécimaux

Les classes sont des indicateurs de groupes de caractères et non des groupes de caractères alternatifs, de ce fait, elle doivent impérativement apparaitre dans les listes en tant qu'entité à part entière.
ex. : pour spécifier un chiffre, il faut impérativement spécifier la classe [:digit:] dans le cadre de caractères alternatifs soit : [[:digit:]] ce qui est strictement équivalent à [0-9].
de même, [A-F[:digit:]a-f] sera l'une des équivalences à [[:xdigit:]] au même titre que [0-9A-Fa-f].

Les substitutions de processus

<(XXX)          renvoie la sortie de la commande XXX vers l'entrée standard
>(XXX)          envoie la sortie standard sur l'entrée standard de la commande XXX

Cas plus complexes (attention) :

<<TAG…          redirection locale
TAG             (TAG de fin en première colonne)
<<-TAG          redirection locale
      TAG       (TAG de fin indenté par des tabulations)
< <(XXX)        redirection de la substitution
 ^              attention à ne pas faire de confusion.
                espace indispensable, sans quoi la substitution serait prise pour une redirection

Et une variante de la redirection locale, dont le format est :

<<< word
   ^ word est expansé puis soumis à l'entrée standard de la commande.

Les séquences d'échappements

CodeRésultatRaison (pourquoi est-ce nécessaire)
\<cr> ligne composée séquence d'échappement
\ l'espace séparation
\! le point d'exclamation historique
\“ la quote double chaine interprétée
\' la quote chaine brute
\$ le dollar variable ou expansion
\& le et commercial tâche de fond ou tube
\* l'étoile joker d'expansion de noms
\. le point joker regex
\< inférieur à redirection
\> supérieur à redirection
\( parenthèse ouvrante expansion numérique
\) parenthèse fermante expansion numérique
\; point virgule séparateur d'instructions
\? point d'interrogation joker d'expansion de noms
\[ crochet ouvrant expansion logique ou caractères alternatifs de regex
\\ la barre oblique inverse échappement
\] crochet fermant expansion logique ou caractères alternatifs de regex
\{ accolade ouvrante expansion accolade
\| la barre verticale tube
\} accolade fermante expansion accolade
CodeDescriptionCodes alternatifs
OctalUnicodeHexadécimal
\a alerte (bip) \007 \u0007 \x07
\b espace \040 \u0020 \x20
\n nouvelle ligne \012 \u000A \x0a
\r retour à la ligne \015 \u000D \x0d
\t tabulation \011 \u0009 \x09
\v tabulation verticale \013 \u000B \x0b
mais aussi
\nnn caractère en décimal humm… plus vraiment
\0ooo caractère en octal
\uUUUU caractère unicode
\xXX caractère en hexadécimal

quelques variables utiles

CodeDescription
$! pid du processus précédent
$# la position
$$ le pid du shell
$* la liste des paramètres délimités par le caractère dans $IFS sous forme d'une chaîne
$- les options activées par le shell
$0 le nom du shell
$1..$n le paramètre n°n
$? le code de retour du processus précédent
$@ le liste des paramètres délimités par le caractère dans $IFS sous forme de liste de mots
$_ le dernier argument de la dernière commande ou le chemin complet vers celle-ci

Fichier : wiki › bash › expansions - dernière modification le 05/10/2016 à 05:43 par Trollab


trollab.org, Since .... a long time ago, in a galaxy far, far away ...