IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

les tableaux à 2 dimensions ?


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut les tableaux à 2 dimensions ?
    Hello

    Je me demande si un tableau à 2 dimensions est possible ?
    je compte m'en servir pour un petit script iptables.

    l'idée c'est 1 tableau pour les ip, le second pour les ports

    on pourrait donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_tab_ip="ip1 ip2 ip3 " , "22 80 110"
    il faudrait ensuite boucler sur les le(s) tableaux de manière à obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    début de la boucle:
    iptables [ip1] [22]
    iptables [ip2] [80]
    iptables [ip3] [110]
    fin de la boucle
    echo "de l'insertion des règle"
    mais je ne sais pas si c'est possible ?
    Merci d'avance

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Il n'est pas possible en bash d'utiliser un tableau à deux dimensions avec les fonctions natives.

    Mais avec un peu de logique on peut utiliser un algo qui fait comme si
    une page d'exemple : http://abs.traduc.org/abs-5.0-fr/ch26.html

    ceci dit tu peux aussi jouer avec awk ou autre chose qu'un bash.

  3. #3
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Salut.

    Tu doit pouvoir faire des tableaux de tableaux ...

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
     
    array2[0]=1
    array[0]=$array2
     
    echo ${array[0][0]}
    Cordialement,
    Idriss

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    merci pour vos 2 réponses voila en plus clair , ceci peut être pour un débutant (comme moi )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    array2[0]=1
    array3[0]=3
    array[0]=$array2
    array[1]=$array3
     
    echo ${array[1][0]}
    echo ${array[0][0]}
    Edit:
    petit souci on dirait que ça coince
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    arrayip="1 3 6 "
    arrayport="22 40 44"
    array[0]=$arrayip
    array[1]=$arrayport
    echo ${array[1][1]}
    echo ${array[0][1]}
    renvoie

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Par défaut
    La réponse de ok.Idriss m'intrigue, est ce que ca ne serait pas une erreur de sa part ?
    Je veux dire que cela ne me semble pas possible de cette manière et que j'ai l'impression que le bash se contente d'ignorer le deuxième crochet (sans vomir d'erreur de syntaxe au passage).

    Merci d'éclairer ma lanterne.

  6. #6
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Citation Envoyé par AnozerOne Voir le message
    Je veux dire que cela ne me semble pas possible de cette manière et que j'ai l'impression que le bash se contente d'ignorer le deuxième crochet
    En effet, j'ai cette impression aussi. Bref, c'était une piste à explorer (car valable d'un point de vue algorithmique) ... mais bon ça ne fonctionne pas

    Sinon comme l'a montré frp31, il y a d'autres façons de simuler les tableau 2D notamment dans l'advanced bash scripting guide au chapitre des tableaux.

    Sinon bash ne m'a pas signalé d'erreur de syntaxe.

    Cordialement,
    Idriss

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Par défaut
    C'est bien ce qui me semblait, si il y a bien un truc qui manque au bash c'est la possibilité qu'une fonction retourne un valeur (exit ne compte pas).
    On aurait ainsi pu faire une fonction ArrayGet et ArraySet, bien plus lisible à mon humble avis.

    Court se cacher dans un coin pour éviter les foudres des utilisateurs réguliers de bash

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Citation Envoyé par AnozerOne Voir le message
    si il y a bien un truc qui manque au bash c'est la possibilité qu'une fonction retourne un valeur (exit ne compte pas).
    Extrait du man bash :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    return [n]
        La fonction shell en cours d'exécution se termine en renvoyant la valeur n. Si n est omis,
        la valeur renvoyée est celle de la dernière commande exécutée dans le corps de la 
        fonction. Si cette commande est exécutée en dehors d'une fonction, mais durant 
        l'exécution d'un script avec la commande . (source) ce script s'arrête, et la valeur 
        renvoyée est n ou celle de la dernière commande exécutée. Si elle est utilisée en dehors
        d'une fonction ou d'un script exécuté par ., le code retour est Faux.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Par défaut
    Huhu, bon bah j'ai plus qu'à RTFM

    EDIT : Hmm en fait je l'avais bien lu, mais bon être dans la capacité de retourner seulement une valeur entre 0 et 255 n'est pas ce que je voulais dire par la capacité de retourner une valeur, ca ne peut servir essentiellement que comme code de retour ...
    Même si oui on peut utiliser une variable globale intermédiaire et $? on ne peut pas faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Mafonction() { # prenant un argument
       ...
       return $unevaleur # valeur modifiée en fonction de la valeur de l'argument
    }
     
    echo "Mafonction 5"

  10. #10
    Membre expérimenté Avatar de FRUiT
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 83
    Par défaut
    Exemple de script que je fais en ce moment utilisant des tableaux à plusieurs dimensions :

    http://www.secteur7.net/div/qmenu

    Et c'est en sh, avec bash les possibilités sont plus nombreuses.

    Exemple dans le code de qmenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    draw_item() 
    {
    
        eval [ \"\${I_${MID}_1}\" ] || return
    
        local COL=${2:-$NCOL}
        POS=$( eval tput cup $(($1+1)) \$\(\("\${RA_$MID}"+1\)\) )
        eval printf \"\${POS}\${COL}%\${WI_$MID}s\${POS}%s\${NCOL}\" \" \" \" \${I_${MID}_${1}} \${TSL}\"
    
        eval local MN=\"\${MN_$MID}\" ; eval IID_$MN=\"\${IID}\"
    
    }

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Par défaut
    Je viens de découvrir les associative array en bash (introduit depuis bash 4.1)

    #!/bin/bash

    declare -A xDarray

    xDarray[0 1]=1
    xDarray[1 0]=2
    xDarray[9 -5 6]=3

    echo ${xDarray[0 1]}
    echo ${xDarray[1 0]}
    echo ${xDarray[9 -5 6]}

    sleep 5
    Ca peut permettre de virtuellement créer et utiliser un tableau de X dimensions de façon très triviale, bon après c'est à proscrire dans de grosses loop ou autre, mais ca reste cool à utiliser quand il n'y a pas besoin de performance ou une gestion critique de la mémoire utilisée.
    Etant donné que le paramètre est un string on peut même utiliser des index négatifs.

    PS : Le xD, même s'il représente une X dimension est aussi un smiley et oui c'est voulu, car je considère cela plus comme un gadget à utiliser avec parcimonie dans un script perso qu'autre chose

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    Citation Envoyé par FRUiT Voir le message
    Exemple de script que je fais en ce moment utilisant des tableaux à plusieurs dimensions :

    http://www.secteur7.net/div/qmenu

    Et c'est en sh, avec bash les possibilités sont plus nombreuses.

    Exemple dans le code de qmenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    draw_item() 
    {
    
        eval [ \"\${I_${MID}_1}\" ] || return
    
        local COL=${2:-$NCOL}
        POS=$( eval tput cup $(($1+1)) \$\(\("\${RA_$MID}"+1\)\) )
        eval printf \"\${POS}\${COL}%\${WI_$MID}s\${POS}%s\${NCOL}\" \" \" \" \${I_${MID}_${1}} \${TSL}\"
    
        eval local MN=\"\${MN_$MID}\" ; eval IID_$MN=\"\${IID}\"
    
    }
    Ouch
    c'est pas facilement lisible le truc, je ne pense pas que je vais m'en servir, mai ça peux servir a d'autre. le but c'est que sa fonctionne déjà

    Merci pour le code.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    Citation Envoyé par AnozerOne Voir le message
    Je viens de découvrir les associative array en bash (introduit depuis bash 4.1)



    Ça peut permettre de virtuellement créer et utiliser un tableau de X dimensions de façon très triviale, bon après c'est à proscrire dans de grosses loop ou autre, mais ca reste cool à utiliser quand il n'y a pas besoin de performance ou une gestion critique de la mémoire utilisée.
    Etant donné que le paramètre est un string on peut même utiliser des index négatifs.

    PS : Le xD, même s'il représente une X dimension est aussi un smiley et oui c'est voulu, car je considère cela plus comme un gadget à utiliser avec parcimonie dans un script perso qu'autre chose
    c'est une bonne chose de plus en shell
    Mais comment on boucle dessus avec une boucle for ?

    pour les 2 tableau direct on fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #!/bin/bash
     
    declare -A xDarray
     
    xDarray[0 1]=1
    xDarray[0 2]=3
    xDarray[1 0]=2
    xDarray[2 0]=4
     
     
    #echo ${xDarray[0 1]}
    #echo ${xDarray[0 2]}
    #echo ${xDarray[1 0]}
    #echo ${xDarray[2 0]}
     
    for var in ${xDarray[@]}
    do
    	echo $var
    done
    J'ai besoins des 2 dimensions en même temps (donc le nombre d'éléments est le même dans chaque tableau)
    en gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for var1 var2 in ${xDarray[@]}
    do
    	echo "colonne 1"$var1 "colonne 2" $var2
    done

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Par défaut
    Tu veux faire quoi exactement ?

    Je veux dire boucler sur le tableau dans un ordre particulier ou non ?
    Tu veux faire quoi avec chaque élément du tableau, etc ...

  15. #15
    Membre expérimenté Avatar de FRUiT
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 83
    Par défaut
    Citation Envoyé par panthere noire Voir le message
    Ouch
    c'est pas facilement lisible le truc, je ne pense pas que je vais m'en servir
    Le trux à en retenir, c'est que sous bash, tu peux combiner la méthode eval, ET la méthode des tableaux natifs bash (donc avoir un tableau a une dimension de la forme ${array[x]}, et en plus un tableau de ce tableau avec eval). Ca fait une syntaxe un petit peu moins compliquée.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    Citation Envoyé par AnozerOne Voir le message
    Tu veux faire quoi exactement ?

    Je veux dire boucler sur le tableau dans un ordre particulier ou non ?
    Tu veux faire quoi avec chaque élément du tableau, etc ...
    pour l'ordre cela n'importe peux,
    pour la suite : on peux prendre iptables pour y voir un peux plus claire.hum..

    iptables -A INPUT -p tcp --dport $port -m iprange $ip

    il suffi donc d'avoir les port et l'ip dans 2 tableau qui seron remplis auparavant.

    pour reprendre le code plus bas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for port ip in ${xDarray[@]}
    do
    	 iptables -A INPUT -p tcp --dport $port  -m iprange $ip
    done
    avidement la syntaxe n'est pas correct ...
    merci pour vos réponse

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Par défaut
    xDarray[ip port]=<valeur>

    Tu as comme clefs l'ip et le port, mais utilises tu aussi la valeur stockée "<valeur>" ?
    Ça peut paraître très débile comme question, mais comme tu n'en parles pas je préfères demander, car si tu n'utilises pas la valeur stockée, alors un tableau en 1 dimension suffit. (ne t'offusque pas si cela te semble évident, personne n'est à l'abri d'une bête erreur de conception)

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    Citation Envoyé par AnozerOne Voir le message
    xDarray[ip port]=<valeur>

    Tu as comme clefs l'ip et le port, mais utilises tu aussi la valeur stockée "<valeur>" ?
    Ça peut paraître très débile comme question, mais comme tu n'en parles pas je préfères demander, car si tu n'utilises pas la valeur stockée, alors un tableau en 1 dimension suffit. (ne t'offusque pas si cela te semble évident, personne n'est à l'abri d'une bête erreur de conception)
    ben oui j'utilise les valeur
    par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var_tab_port_spring_client="8459 8455 8454 8452 8451 8450"
    var_tab_ip_ping="91.1.0.0-91.255.255.255 94.1.0.0-94.255.255.255"
    # bon les ip/port son bidon évidement...
    for ? in $var_tab*
    do
         iptables -A INPUT -p udp  -m state --state RELATED,ESTABLISHED -m multiport --source-port $var_tab_port_spring_client -m iprange --src-range $var_tab_ip_ping  -j ACCEPT
     
    done
    comment je fait avec la boucle fort a ce moment là?
    je peux pas utiliser le port comme reference ,ni l'ip, mai je peux boucler sur le nombre d'élément, chose que j'ai trouver dans le prescedant post, reste a faire reference aux bon tableaux ?

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/bin/bash
     
    declare -A xDarray
     
    xDarray[0 1]=1
    xDarray[0 2]=3
    xDarray[1 0]=2
    xDarray[2 0]=4
     
    for index in "${!xDarray[@]}"
    do
       echo "index: $index, valeur stockée: ${xDarray[$index]}."
       # on récupère les 2 index, note que le nombre d'espaces ne sera pas pris en compte entre les 2 index avec cette méthode, mais il faut un au minimum
       # et puis il vaut mieux simplement être rigoureux et ne faire qu'un espace comme au début du script
       set $index
       echo "index 1 = $1"
       echo "index 2 = $2"
    done

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    merci pour ta réponse,

    mais ta boucle liste les tableaux sur le premier index, puis passe à l'index suivant.

    il me faut lors du même passage avoir accès aux "valeur stockée" des 2 index sur la même ligne (sinon un tableau simple suffit)

Discussions similaires

  1. Les tableaux deux dimensions
    Par Youbi dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 23/02/2010, 13h05
  2. question bête sur les tableaux à 2 dimensions
    Par laurentSc dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/10/2009, 23h41
  3. Algorithme sur les tableaux à grandes dimensions
    Par bobo034 dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 26/05/2008, 17h11
  4. Réponses: 12
    Dernier message: 17/12/2006, 12h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo