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 :

Accès à un élément de tableau


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 38
    Points
    38
    Par défaut Accès à un élément de tableau
    Bonjour,

    Mon problème est des plus simples et je suis sure que la réponse le sera si j'arrive à bien exprimer mon problème.

    1) je crée et je remplis dynamiquement un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for BORNE in $BORNE_TRAITEMENT
    do
    		CHAINE$BORNE[2]=10;
    		CHAINE$BORNE[3]=20;
    		CHAINE$BORNE[4]=30;
    		CHAINE$BORNE[5]=55;	
    done
    2) Puis plus loin dans mon script, je dois récupérer dynamiquement les valeurs du tableau "CHAINE$BORNE[]"

    Pour constituer le nom de mon tableau je concatène dans une boucle le string "CHAINE" avec le contenue d'une variable et le string "[5]"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NOM="CHAINE"$BORNE_CHAINE"[5]";

    Mon problème est que je n'arrive pas a utiliser le contenu de ma variable "NOM" pour interroger mon tableau et récupérer l’élément.....
    Au mieux je le récupère mais avec une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [user@Srv user]$ eval `echo '${'$NOM'}'`
    -bash: 55: command not found
    Auriez-vous une idée à me proposer ?
    D'avance merci.

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Les lignes d'affectations sont incorrectes. Ça doit être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval CHAINE$BORNE[2]=10
    Pour l'affichage, il faut écrire:

    PS: Méfie toi de la commande eval qui, à juste titre, a une très mauvaise réputation ...
    ɹǝsn *sıɹɐlos*

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    Concernant eval, c'est pour en éviter l'utilisation que j’étais passé par la création de tableau. Mais finalement je suis obligé de l'utiliser.....

    Merci pour tout...

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    Bonjour,

    pourquoi ne pas utiliser un tableau associatif ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    declare -A Chaine
    for borne in $borne_traitement
    do
    		Chaine["${borne}_2"]=10;
    		Chaine["${borne}_3"]=20;
    		Chaine["${borne}_4"]=30;
    		Chaine["${borne}_5"]=55;	
    done
    tout plutôt qu'eval ! surtout en bash !

    il faudrait quand même qu'on en sache plus sur la manière dont borne_traitement est remplie.
    est-ce que la valeur borne peut se répéter ?
    sinon la numérotation est inutile.

    NB: il est préférable de ne pas utiliser des noms de variables tout en majuscules, afin d'éviter des collisions avec des variables d'environnement.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Bonsoir,

    borne_Traitement est une liste et pour chaque borne je peux avoir 5 valeurs à récupérer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    borne_Traitement="CLAUDE10Q_00 \
    CLAUDE10Q_ZZ \
    CLAUDE11Q_00 \
    CLAUDE11Q_ZZ \
    CLAUDE15Q_00 \
    CLAUDE15Q_ZZ \
    CLAUDE12Q_00 \
    CLAUDE12Q_ZZ \
    CLAUDE17Q_00 \
    CLAUDE17Q_ZZ \
    "
    Votre idée de tableau associatif me va bien car c’était ma première idée.
    Par contre j'avais du me tromper dans la syntaxe car je n'arrivais pas à initialiser mon tableau.

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    oui, les tableaux associatifs doivent impérativement être déclarés préalablement.

    borne_Traitement pourrait déjà être un tableau; mais ce n'est pas très important : les valeurs de borne_Traitement ne comportant pas d'espaces.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    Les valeurs de borne_Traitement contiennent deux types de valeurs :

    - Des dates au format "%Y%m%d %H%M%S"
    - Des dates au format seconde.

    Il y a donc des espaces dans les valeurs.

    Pourquoi ?

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    declare -A aA
    a=( "jour heure" "secondes" )
    for i in "${a[@]}"
    do
       aA["${i}_1"]=val_1
       aA["${i}_2"]=etc...
    done
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    Je ne sais pas pourquoi mais la solution du tableau associatif proposé dans le 1er exemple ne fonctionne pas.... je m'y prends certainement mal.

    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    pourquoi ne pas utiliser un tableau associatif ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    declare -A Chaine
    for borne in $borne_traitement
    do
    		Chaine["${borne}_2"]=10;
    		Chaine["${borne}_3"]=20;
    		Chaine["${borne}_4"]=30;
    		Chaine["${borne}_5"]=55;	
    done
    tout plutôt qu'eval ! surtout en bash !

    il faudrait quand même qu'on en sache plus sur la manière dont borne_traitement est remplie.
    est-ce que la valeur borne peut se répéter ?
    sinon la numérotation est inutile.

    NB: il est préférable de ne pas utiliser des noms de variables tout en majuscules, afin d'éviter des collisions avec des variables d'environnement.

    Je ne fais qu’écraser la valeurs précédente.

    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
    /tmp>declare -a Chaine;
    /tmp>borne=toto;
    /tmp>Chaine["${borne}_2"]=10;
    /tmp>echo ${Chaine["${borne}_2"]};
    10
     
    /tmp>Chaine["${borne}_3"]=20;
    /tmp>echo ${Chaine["${borne}_3"]};
    20
    /tmp>echo ${Chaine["${borne}_2"]};
    20
     
    /tmp>Chaine["${borne}_4"]=30;
    /tmp>echo ${Chaine["${borne}_4"]};
    30
    /tmp>echo ${Chaine["${borne}_3"]};
    30
    /tmp>echo ${Chaine["${borne}_2"]};
    30

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    la différence entre nos commandes est subtile, mais importante :
    en bash
    • les tableaux associatifs doivent impérativement être déclarés avec l'option -A,
    • les tableaux indexés peuvent être déclarés avec l'option -a

    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Je pense que la version du bash présent sur les machines de mon entreprise sont trop vieux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NU bash, version 2.05b.0(1)-release (i386-redhat-linux-gnu)
    Copyright (C) 2002 Free Software Foundation, Inc.
    alors qu'apparemment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bash 4.0 introduced support for associative arrays

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    c'est honteux !
    et les machines, c'est des 386 ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Par chance en début d'année on va changer de machine et tout passer en Redhat 5

  14. #14
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    passe à awk : les tableaux y sont toujours associatifs, et peuvent être multidimensionnels.
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/awk -f
     
    BEGIN{
       bT="jour he:ur:es;secondes"
       split(bT,aA,";")
       for (i in aA){
          aA[i"_1"]=10;
          aA[i"_2"]=20
          #etc...
       }
    }
    pour faire simple, mais on peut faire mieux

    tout plutôt que eval.
    voilà pour bash2.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Merci pour toutes ces explication....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/04/2015, 19h47
  2. Réponses: 4
    Dernier message: 19/03/2015, 19h31
  3. Acces aux éléments dans un tableau 2D
    Par jamesleouf dans le forum JSF
    Réponses: 1
    Dernier message: 03/12/2009, 18h47
  4. Réponses: 6
    Dernier message: 12/09/2007, 16h58
  5. Soustraire des éléments de tableau entre eux
    Par syl2095 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/01/2005, 16h29

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