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.
{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
(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 |
${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
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
${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
$(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
$((…)) 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
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].
<(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.
Code | Résultat | Raison (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 |
Code | Description | Codes alternatifs | ||
---|---|---|---|---|
Octal | Unicode | Hexadé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 |
Code | Description |
---|---|
$! | 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