Variables bash et expansion des accolades

Si vous manipulez un peu bash, et si vous faites des scripts shell dans cet environnement, vous avez forcément une petite expérience de l'expansion.

Par exemple, vous pouvez utiliser une * pour spécifier à bash qu'il doit construire tout seul la liste des arguments :

$ ls -1d /home/*
/home/riri
/home/fifi
/home/loulou

Il existe d'autres types d'expansion, mais celui qui m'intéresse est le cas assez inusité des expansions d'accolades. Ces dernières permettent de spécifier des listes totalement arbitraires. Par exemple, je peux écrire :

$ ls -1d /home/{riri,fifi}
/home/riri
/home/fifi

En précisant un préfix ou un suffix commun, je n'ai plus qu'à placer la partie variable entre { }. Je peux aussi préciser un intervalle qui permet de générer une séquence :

$ ls -1 /dev/ttyp{0..3}
/dev/ttyp0
/dev/ttyp1
/dev/ttyp2
/dev/ttyp3

Je maîtrise alors bien mieux le résultat de l'expansion qu'en utilisant simplement *. Par ailleurs, l'utilisation de * est impossible si les éléments ciblés n'existent pas sur le disque, ce qui limite énormément son périmètre d'utilisation.

Si dans le cadre d'un script je décide de définir d'un côté ma liste de dossiers, et de l'autre côté d'utiliser cette liste dans une boucle par exemple, je peux procéder comme cela :

$ MaListe=/home/*
$ for Dossier in $MaListe; do echo $Dossier; done
/home/riri
/home/fifi
/home/loulou

Cela fonctionne sans problème avec * mais cela ne fonctionne pas avec les accolades car l'expansion de { } ne se fait pas dans le cadre d'une assignation de variable :

$ MaListe=/home/{riri,fifi}
$ for Dossier in $MaListe; do echo $Dossier; done
/home/{riri,fifi}

Il est possible de contourner cette limitation. On utilise alors les parenthèses, qui permettent de forcer l'expansion des accolades, et qui transforment MaListe en tableau :

$ MaListe=( /home/{riri,fifi} )
$ for Dossier in ${MaListe[@]}; do echo $Dossier; done
/home/riri
/home/fifi

Et voilà !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.