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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    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
    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 ...

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    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 703
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 703
    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.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    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 703
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 703
    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.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 703
    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


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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    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

+ 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