[#!/fr] expansion de {a,b,c} dans un script bash

Page principale
Supprimer ce message
Répondre à ce message
Auteur: Patrick Proniewski
Date:  
À: La liste francophone des scripts shell
Sujet: [#!/fr] expansion de {a,b,c} dans un script bash
Bonjour,

Je viens de lutter avec un problème d'expansion dans bash, et j'ai
trouvé la solution, alors je vous en fait profiter.

J'ai un script de backup qui boucle sur un certain nombre de
répertoires et fait un rsync pour chacun.
J'aimerai simplifier la liste. J'avais ça :

    SRC="/etc /home/toto /home/titi /home/tata /home/tutu /usr/local/www / 
usr/local/mailman /var/db/lurker
    /usr/local/var/www/lurker /usr/local/etc /var/named/etc"


    for i in $SRC; do
        ....
    done


J'ai pu simplifier facilement SRC grace à l'utilisation de /home/* :

    SRC="/etc /home/* /usr/local/www /usr/local/mailman /var/db/lurker / 
usr/local/var/www/lurker /usr/local/etc /var/named/etc"


Je voudrai utiliser aussi :
- "/usr/local/{etc,mailman,www,var/www/lurker}" à la place de "/usr/
local/etc /usr/local/www /usr/local/mailman /usr/local/var/www/lurker"
- "{/,/var/named/}etc" à la place de "/etc /var/named/etc"

Donc idéalement, SRC ressemblerait à ça finalement :

    SRC="{/,/var/named/}etc /home/* /usr/local/{etc,mailman,www,var/www/ 
lurker} /var/db/lurker"


Dans le shell l'expansion est opérationnelle :

    $ ls -d1 {/,/var/named/}etc
    /etc
    /var/named/etc


Mais dès que j'essaye de créer une variable, cela ne fonctionne plus :

    $ SRC={/,/var/named/}etc
    $ ls -d1 $SRC
    ls: {/,/var/named/}etc: No such file or directory


En réalité, les expansions de * et de {} n'ont pas lieu du tout au
même moment, dans le shell. Et pour parvenir à développer les {} quand
on est dans le contexte d'une variable il faut passer par un tableau
(liste) de bash :

    $ SRC=( {/,/var/named/}etc)
    $ ls -d1 ${SRC[@]}
    /etc
    /var/named/etc


Et voilà :)

Au final, j'ai bien mon expansion complète :

    $ SRC=( {/,/var/named/}etc /home/* /usr/local/{etc,mailman,www,var/ 
www/lurker} /var/db/lurker )
    $ for rep in ${SRC[@]}; do echo $rep; done
    /etc
    /var/named/etc
    /home/toto
    /home/titi
    /home/tata
    /home/tutu
    /usr/local/etc
    /usr/local/mailman
    /usr/local/www
    /usr/local/var/www/lurker
    /var/db/lurker



patpro_______________________________________________
archives :
http://listes.patpro.net/list/sshfr.fr.html
http://listes.patpro.net/mailman/listinfo/script_shell_fr