Les expansions et substitutions dans le bash
Historique
13 mars 2012 : Création de cette page.
28 août 2012 : Complément avec les opérations mathématiques.
Difficulté
Pour : un esprit logique et curieux.
Introduction
On appelle couramment "expansion" le fait que bash remplace un élément par un autre élément (une substitution). Exemple, les variables :
nombre=3 la variable nombre prend la valeur 3
dans $nombre bash substitue la valeur de la variable au nom de la variable
Utiliser les jockers
Dans l'écriture des commandes, vous pouvez utiliser un caractère jocker, c'est-à-dire un caractère qui remplace un ou plusieurs caractères classiques.
Un exemple est plus parlant : copier depuis le répertoire courant, vers un autre répertoire, tous les fichiers qui ont l'extension .txt
cp *.txt /autre/repertoire/
Ici le jocker * est utilisé. * remplace n'importe quels caractères, quel qu'en soit le nombre.
Jocker | Usage | Exemple | Signification |
* | remplace 0, 1 ou plusieurs caractères | ls *.doc | liste tous les fichiers .doc |
? | remplace 1 caractère | ls *.do? | liste tous les fichiers .doc et .dot, par exemple |
Utiliser les accolades
Les accolades permettent de s'éviter de retaper des morceaux de commandes. Trois exemples sont plus parlants :
touch texte{1,2,3} va créer 3 fichiers nommés respectivement texte1, texte2 et texte3.
touch texte{1..3} aurait également créé ces 3 fichiers.
rm texte{1..3} va supprimer ces 3 fichiers.
Expansion et substitution des variables
Bash offre maintenant des possibilités très appréciables en matière de substitution, extraction et suppression.
Soit une variable var="bonjour, le monde, tout le monde."
- longueur de la chaîne : ${#variable}.
echo ${#variable}=> 33
- extraire : ${variable:position:longueur}. Si longueur est omise, extraction jusqu'à la fin.
echo ${variable:3:4}=> jour
- supprimer la correspondance la plus petite de motif à partir du début de la chaine : ${variable#motif}. Le motif peut comprendre *, ? et [...]
echo ${variable#*ou}=> r, le monde, tout le monde.
- supprimer la correspondance la plus longue de motif à partir du début de la chaine : ${variable##motif}. Le motif peut comprendre *, ? et [...]
echo ${variable##*ou}=> t le monde.
- supprimer la correspondance la plus petite de motif à partir de la fin de la chaine : ${variable%motif}. Le motif peut comprendre *, ? et [...]
echo ${variable%on*}=> bonjour, le monde, tout le m
- supprimer la correspondance la plus longue de motif à partir de la fin de la chaine : ${variable%%motif}. Le motif peut comprendre *, ? et [...]
echo ${variable%%on*}=> b
- remplacer la première correspondance dans la chaîne : ${variable/motif/remplaçant}. Le motif peut comprendre *, ? et [...]
echo ${variable/le monde/l\'univers}=> bonjour, l'univers, tout le monde. Remarquez l'échappement (\') de l'apostrophe.
- remplacer le début la chaîne : ${variable/#motif/remplaçant}. Le remplacement se fait si motif est le début de $variable
echo ${variable/#bonjour/salut}=> salut, le monde, tout le monde.
- remplacer la fin de la chaîne : ${variable/%motif/remplaçant}. Le remplacement se fait si motif est la fin de $variable
echo ${variable/%le monde/l\'univers}=> bonjour, le monde, tout l'univers. Remarquez l'échappement (\') de l'apostrophe.
- remplacer de toutes les correspondances dans la chaîne : ${variable//motif/remplaçant}. Le motif peut comprendre *, ? et [...]
echo ${variable//le monde/l\'univers}=> bonjour, l'univers, tout l'univers. Remarquez l'échappement (\') de l'apostrophe.
- utiliser une valeur par défaut, si la variable est vide, au départ : ${variable:-valeur}.
echo ${variable:-33}=> 33, mais variable est toujours vide.
- attribuer une valeur par défaut, si la variable est vide, au départ : ${variable:=valeur}.
echo ${variable:=33}=> 33 et variable n'est plus vide.
- utiliser le résultat d'une commande. Deux écritures sont possibles : $(commande) ou `commande`.
echo $(date)=> jeu mai 1 09:26:34 CEST 2008.
echo `date`=> jeu mai 1 09:26:34 CEST 2008.
- mettre le premier caractère en minuscule
echo ${variable,}
- mettre tous les caractères en minuscule
echo ${variable,,}
- mettre le premier caractère en majuscule
echo ${variable^}
- mettre tous les caractères en majuscule
echo ${variable^^}
Opérations mathématiques
Bash permet également de faire des évaluations mathématiques sur des entiers.
Plusieurs formes sont possibles : ((expression)), $((expression)), $[expression]
Bash évalue l'expression qui peut utiliser beaucoup d'opérateurs, dont les plus courants : +,-, *, /, % (reste), ** (exponentielle). Exemples :
((val = val + 8)) ajoute 8 à val. Notez l'absence de $ pour la variable.
$((val + 8))calcule le résultat, mais ne change pas la valeur de la variable val.
$[val + 8]calcule le résultat, mais ne change pas la valeur de la variable val.
echo $((++val))incrémente la variable, puis l'affiche.
echo $((val++))affiche la variable, puis l'incrémente.
la commande ((expression)) peut également être utilisée dans un test (simple ou avec if/then/fi) :
((val + 8 == val2)) && ....