Forum Programmation.shell Variables dans un shell script (sh)

Posté par  .
Étiquettes : aucune
0
5
déc.
2005
Bonjour à tous,

Je me trouve confronté à un petit problème de gestion de mes variables dans un shell script.
Le but de ce script est de lancer des commandes rsync.

Tout d'abord, sachez que j'utilise le shell "normal" (/bin/sh).

#!/bin/sh


Ensuite, je définis 3 variables que j'exporte


PATH_SOURCE="/opt"
PATH_DESTINATION="/opt/destination"

export PATH_SOURCE PATH_DESTINATION_1 PATH_DESTINATION_2


Ensuite, je définis d'autres variables, qui sont en fait, une concatenation des 3 variables précédentes, que j'exporte également


PSRC1="$PATH_SOURCE/dir1/dir2/dir3"
PDST1="$PATH_DESTINATION_1/dir1/dir2/dir3"
PSRC2="$PATH_SOURCE/dir4/dir5"
PDST2="$PATH_DESTINATION_1/dir4/dir5"
PSRC3="$PATH_SOURCE/dir6/dir7/dir8"
PDST3="$PATH_DESTINATION_1/dir6/dir7/dir8"
PSRC4="$PATH_SOURCE/dir9"
PDST4="$PATH_DESTINATION_1/dir9"
PSRC5="$PATH_SOURCE/dir1/dir4/dir3"
PDST5="$PATH_DESTINATION_1/dir1/dir4/dir3"

export PSRC1 PDST1 PSRC2 PDST2 PSRC3 PDST3 PSRC4 PDST4 PSRC5 PDST5


Pour l'instant, je lance, une à une les commandes rsync


rsync -crtvz --delete -e "ssh -i key_id_dsa" $PSRC1 MonUserDistant@MaMachineDistante:$PDST1
rsync -crtvz --delete -e "ssh -i key_id_dsa" $PSRC2 MonUserDistant@MaMachineDistante:$PDST2
rsync -crtvz --delete -e "ssh -i key_id_dsa" $PSRC3 MonUserDistant@MaMachineDistante:$PDST3
rsync -crtvz --delete -e "ssh -i key_id_dsa" $PSRC4 MonUserDistant@MaMachineDistante:$PDST4
rsync -crtvz --delete -e "ssh -i key_id_dsa" $PSRC5 MonUserDistant@MaMachineDistante:$PDST5


Ceci est une bribe de script, le script reel est bien plus important et devient ingérable du fait de sa longueur excessive.
J'en viens donc à ma question :

Comment faire pour utiliser des variables de remplacement dans une boucle for (par exemple), sachant que que je veux récupérer le
contenu des variables associées au $i parcouru dans la boucle for ... mais je n'y parviens pas :(


For i in 1 2 3 4 5; do
#echo $i
#echo PSRC$i
#echo `PSRC$i`

rsync -crtvz --delete -e "ssh -i key_id_dsa" $PSRC$i MonUserDistant@MaMachineDistante:$PDST$i
done

D'avance un grand merci de votre aide (précieuse)
  • # eval ?

    Posté par  . Évalué à 4.

    Ça serait pas "eval" que tu cherches ?

    % cat /tmp/eval.sh
    #!/bin/sh
    plop_1="plip"
    plop_2="plup"
    for i in 1 2 ; do eval echo \"\$plop_$i\" ; done

    % /tmp/eval.sh
    plip
    plup


    En gros, ça ajoute une passe d'évaluation à ta commande, donc avec i=1, \$plop_$i devient $plop_1 et \"\$plop_$i\" devient "$plop_1".

    Reste à voir si c'est du Bourne de base ou du Bash, je ne me souviens plus...
  • # un tableau ?

    Posté par  (site web personnel) . Évalué à 2.

    ce que tu demandes bin ça ressemble à un tableau


    PSRC=("$PATH_DESTINATION_1/dir1/dir2/dir3" "$PATH_SOURCE/dir4/dir5")

    for i in `seq ${PSRC[*]}`
    do
    truc ${PSRC[$i]}
    done
    • [^] # Re: un tableau ?

      Posté par  (site web personnel) . Évalué à 2.

      oups pitit erreur

      longueur du tableau == ${#PSRC[*]}
    • [^] # Re: un tableau ?

      Posté par  . Évalué à 4.

      Certes, mais ça par contre je suis à peu près sûr que c'est du Bash, et pas du bourne shell de base comme demandé, donc ça ne marchera pas partout.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.