Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/08/2011, à 03:43

Tomzz

[Résolu] Faire une condition sur variable nommée par variable

Bonjour,

Je butte sur un petit truc:
Je cherche à nommer une variable à l'aide d'une autre variable dans une boucle while.

Voilà le morceau de code qui me gène:

while [ ! "${nbdep}" = "1" ]
    do
           if [ eval "\"\${amd${nbdep}}\"" = "true" ]; then
               {
                 ....
               }
           fi
           ((nbdep--))
        done

La condition que je cherche à obtenir c'est:

if [ "${amd2}" = "true" ]; then ...

Où 2 est remplacé par la valeur de $nbdep qui est définie par divers choix au cours du script.

PS: c'est pour "le projet qui me tiens à cœur" de ma signature

Dernière modification par Tomzz (Le 22/08/2011, à 15:30)

Hors ligne

#2 Le 22/08/2011, à 10:57

ehmicky

Re : [Résolu] Faire une condition sur variable nommée par variable

Salut,
tu peux essayer :

if [[ "$(eval "echo \$amd$nbdep")" == "true" ]]

(ou utiliser une array associative ou non $amd plutôt qu'un ensemble de variable $amd1, $amd2, etc.)

Dernière modification par ehmicky (Le 22/08/2011, à 10:59)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#3 Le 22/08/2011, à 13:16

AnsuzPeorth

Re : [Résolu] Faire une condition sur variable nommée par variable

~$ nbdep=1
~$ amd1=true
~$ v=amd${nbdep}
~$ echo ${!v}
true

C'est pas ça que tu cherches ?


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#4 Le 22/08/2011, à 14:50

Tomzz

Re : [Résolu] Faire une condition sur variable nommée par variable

Bonjour,

Et merci à tout les deux.
J'ai adopté la solution de AnsuzPeorth, ça donne:

while [ ! "${nbdep}" == "1" ]
    do
        depb="dep${nbdep}"
        xb="x${nbdep}"
        amdb="amd${nbdep}"
        lignb="lign${nbdep}"
        
        if [ "${!depb}" == "true" ]; then
            {
                if [ "${!xb}" == "true" ]; then
                    {
                        echo "deb ${!lignb}" >> $HOME/.deb-offline/tmp/dernchoix.txt
                    }
                fi
                
                if [ "${!amdb}" == "true" ]; then
                    {
                        echo "deb-amd64  ${!lignb}" >> $HOME/.deb-offline/tmp/dernchoix.txt
                    }
                fi
            }
        fi
        
        ((nbdep--))
    done

Hors ligne

#5 Le 22/08/2011, à 17:32

valAa

Re : [Résolu] Faire une condition sur variable nommée par variable

Hello,
Je vais poser une question peut-être naïve mais qui me titille car c'est pas la première fois que je vois ce type de code en bash.
Le bash c'est pas trop mon truc, mais je connais un peu mieux d'autres langages.
Ma question est :

y a-t-il une raison pour ne pas utiliser des tableaux dans ce type de situation ?

Hors ligne

#6 Le 22/08/2011, à 19:08

Tomzz

Re : [Résolu] Faire une condition sur variable nommée par variable

Dans mon cas précis, c'est parce que je remplis les variables depuis une boite Gtkdialog qui est elle même générée dans une boucle.

En fait je regarde dans un fichier de config les dépôts qui sont disponibles sur un disque de miroir de divers dépôts.
À partir de cette liste je propose des boites de dialogues avec une case à cocher pour chaque dépôts dispo et les architectures disponible.
Le but est de générer un nouveau fichier de config destiné à un autre disque de miroirs qui recevra, ainsi, une copie des dépôts sélectionnés depuis le disque d'origine.

De toutes façon je publierai mon script complet lorsqu'il sera plus avancé.

Attention, je n'ai pas la prétention de maitriser Bash, loin de là, mes scripts font souvent sourire les pros d'ailleurs.
Mais quand j'ai besoin d'une fonction, ben je me débrouille pour me la faire avec les connaissances, et le temps que j'ai.

En l'occurrence, par exemple, j'ai besoin d'un truc qui marche suffisamment bien pour le 4 septembre.
C'est pourquoi je continue avec Gtkdialog, car je n'ai pas le temps d'apprendre autre chose et comme le développement semble avoir repris...

Tiens, je livre en l'état là où j'en suis.
Juste pour le coup d'œil parce que pour le moment ça ne fais rien d'autre que de créer une liste de dépôts, les commentaires ne sont pas à jour et il faut sûrement que je revois la gestion des fichiers temporaires qui date d'une ancienne version:

#!/bin/bash
#


###################################################################################################################################################
## Copyright (C) 2011 www.2aide.fr                                                                                                               ##
##                                                                                                                                               ##
## Ce programme est un logiciel libre, vous pouvez le redistribuer et / ou le modifier selon les termes de la Licence Publique Générale GNU      ##
## telle que publiée par la Free Software Foundation; soit la version 2 de la Licence, ou (à votre choix) toute version ultérieure.              ##
##                                                                                                                                               ##
## Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE, sans même la garantie implicite de COMMERCIALISATION    ##
## ou D'ADAPTATION A UN USAGE PARTICULIER. Voir la Licence Publique Générale GNU, disponible ici http://www.opensource.org/licenses/gpl-2.0.php  ##
## pour plus de détails.                                                                                                                         ##
##                                                                                                                                               ##
## Vous devriez avoir reçu une copie de la Licence Publique Générale GNU avec ce programme, sinon, écrivez à                                     ##
## Free Software Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                                                          ##
##                                                                                                                                               ##
##                                                                                                                                               ##
##                                 En 2 mots, vous étes libre d'utiliser, de copier et de distribuer ce programme                                ##
##                                  à condition de soumettre votre copie à la même licence GPL v-2 ou ultérieure                                 ##
##                                                                                                                                               ##
###################################################################################################################################################


## supprime les fichiers temporaires au cas ou il en resterai d'une précédante utilisation
rm -r -f $HOME/.deb-offline/tmp/*

## Sauvegarde du fichier hosts
cp /etc/hosts $HOME/.deb-offline/hosts.org



########## choix du disque source à copier ##########
cpt1=0
for sour in `ls /media/`; do
    lsou[$cpt1]="FALSE /media/$sour "
    ((cpt1++))
done

source=$(zenity --width=400 --height=800 --list --column "" --radiolist\
    --title="Disque source" \
    --text="Disque source des dépôts" \
    --column="" \
    ${lsou[@]}) || exit
source1="${source}/miroir/apt-mirror-config"


## Cas où le disque à copier n'est pas dans /media ou que apt-mirror-config n'est pas trouvé
if [ ! -e ${source1} ]; then
    {
        source1=$(zenity --file-selection --title="Indiquez votre apt-mirror-config") || exit
        source=${source1%/miroir/apt-m*}
    }
fi

## Teste si le disque est formaté en ext2 3 ou 4
filesys=$(df -T ${source} | awk '{ print $2 }' | tail -n 1)

if [ "${filesys#ext}" = "$filesys" ]; then
    {
        zenity    --info --ok-label="Mauvais système de fichier" --text="Ce script ne fonctionne que sur des disques formatés en ext2,3 ou 4"
        ## Suppression des fichiers temporaires
        rm -f $HOME/.deb-offline/tmp/*
        exit 0
    }
    fi



########## établi la liste des distributions dont les dépots sont proposés sur le disque ##########
awk '$1 ~ /deb/ {gsub(/-.*|\.\//,""); print $3}' "${source1}" | grep "^[^#|^$|^ *$]" | uniq > $HOME/.deb-offline/tmp/dist-dispo1

## On compare le résultat obtenu avec la liste des realase d'Ubuntu (disponible dans $HOME/.deb-offline/list.distrib) pour ne garder que ce qui est commun aux deux fichiers
perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' $HOME/.deb-offline/tmp/dist-dispo1 $HOME/.deb-offline/list.distrib > $HOME/.deb-offline/tmp/dist-dispo



########## Choix de la ou des distributions pour lesquelles on va copier les dépots ##########
cpt1=0

            for dis in $(cat $HOME/.deb-offline/tmp/dist-dispo); do
                    ub[$cpt1]="FALSE $dis "
                    ((cpt1++))
            done
                    ub[$cpt1]="FALSE Général"

                dist=$(zenity --width=400 --height=800 --list --column "" --checklist\
                --title="Distributions" \
                --text="Choix des distributions" \
                --column="" \
                ${ub[@]}) || exit



##########Choix des dépots correspondant à ou aux distributions choisies ##########
gr="$(sed 's/ //g' $HOME/.deb-offline/tmp/dist-dispo)"
gr="egrep -v '$(echo $gr | sed 's/ /|/g')'"
dist1="$(echo $dist | sed 's/|/ /g')"

        grep "^deb" "${source1}" > $HOME/.deb-offline/tmp/dep-dispo-dist1


    for dist2 in $dist1; do
        grep "^deb" "${source1}" | grep $dist2 | sed 's/\$/\\n/g' >> $HOME/.deb-offline/tmp/dep-dispo-dist
        ## Cas des dépots non liées à une version
        if [ $dist2 = "Général" ]; then
            {
                eval $gr $HOME/.deb-offline/tmp/dep-dispo-dist1 >> $HOME/.deb-offline/tmp/dep-dispo-dist
            }
        fi
    done

########## Choix de la ou des architechtures ##########
awk -F " " '{ $1 = "" ; print $0 }' $HOME/.deb-offline/tmp/dep-dispo-dist | sort | uniq > $HOME/.deb-offline/tmp/dep-dispo-dist2
dep="1"
cat "$HOME/.deb-offline/tmp/dep-dispo-dist2" | while read i
  do
    
    archdsp=$(grep "${i}" "$HOME/.deb-offline/tmp/dep-dispo-dist1")
    if [ -n "$(echo ${archdsp} | grep 'deb-amd64')" ]; then
        {
            amd64="\t<checkbox active=\"true\">\n\t\t<variable>amd${dep}</variable>\n\t\t<label>Amd-64</label>\n\t</checkbox>"
        }
        else
        {
            amd64="\t<checkbox active=\"false\">\n\t\t<visible>disabled</visible>\n\t\t<variable>amd${dep}</variable>\n\t\t<label>Amd-64</label>\n\t</checkbox>"
        }
    fi
    
    if [ -n "$(echo ${archdsp} | grep 'deb http')" ]; then
        {
            x86="\t<checkbox active=\"true\">\n\t\t<variable>x${dep}</variable>\n\t\t<label>X86</label>\n\t</checkbox>"
        }
        else
        {
            x86="\t<checkbox active=\"false\">\n\t\t<visible>disabled</visible>\n\t\t<variable>x${dep}</variable>\n\t\t<label>X86</label>\n\t</checkbox>"
        }
    fi
    cutdep=$((dep/10))
    echo -e "<hbox>\n\t<checkbox active=\"true\">\n\t\t<variable>dep${dep}</variable>\n\t\t<label>\"deb ${i}\"</label>\n\t</checkbox>\n${amd64}\n${x86}\n</hbox>" >> "$HOME/.deb-offline/tmp/dep-dispo-dist3-${cutdep}"
    echo -e "lign${dep}=\"${i}\"\n" >> $HOME/.deb-offline/tmp/var-dep-disp
    ((dep++))
done

            
nblisdep=$(ls $HOME/.deb-offline/tmp/dep-dispo-dist3* | wc -l)

ls -1 $HOME/.deb-offline/tmp/dep-dispo-dist3* | while read lisdep
do

if [ "${nblisdep}" = "1" ]; then
    {
        fin="<hbox homogeneous=\"true\"><button ok></button></hbox>"
        nbdep=$(tail -n6 "${lisdep}" | grep "<variable>x" | cut -d"x" -f2 | cut -d"<" -f1)
        echo "nbdep=\"${nbdep}\"" >> $HOME/.deb-offline/tmp/var-dep
    }
else
    {
        fin="<hbox homogeneous=\"true\"><button><label>Les 10 dépôts suivants >>></label></button></hbox>"
    }
fi

export MAIN_DIALOG='<window title="Choix des dépôts à copier." window_position="1" icon-name="gtk-print">
                        <vbox>
                            '$(cat "${lisdep}")${fin}'
                        </vbox>
                    </window>'
                    
((nblisdep--))

echo -e $(gtkdialog --program=MAIN_DIALOG) | sed 's;" ;"\; ;g' >> $HOME/.deb-offline/tmp/var-dep
done

eval $(cat $HOME/.deb-offline/tmp/var-dep)

eval $(cat $HOME/.deb-offline/tmp/var-dep-disp)


while [ ! "${nbdep}" == "1" ]
    do
        depb="dep${nbdep}"
        xb="x${nbdep}"
        amdb="amd${nbdep}"
        lignb="lign${nbdep}"
        
        if [ "${!depb}" == "true" ]; then
            {
                if [ "${!xb}" == "true" ]; then
                    {
                        echo "deb ${!lignb}" >> $HOME/.deb-offline/tmp/dernchoix.txt
                    }
                fi
                
                if [ "${!amdb}" == "true" ]; then
                    {
                        echo "deb-amd64  ${!lignb}" >> $HOME/.deb-offline/tmp/dernchoix.txt
                    }
                fi
            }
        fi
        
        ((nbdep--))
    done

exit 0
## Il manque toute le seconde partie

De plus, c'est prévu pour fonctionner avec tout une série de scripts.

Hors ligne