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 :

[bash] Problème de parcours d'array


Sujet :

Shell et commandes GNU

  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 115
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 115
    Par défaut [bash] Problème de parcours d'array
    Bonjour,

    soit le code hyper-simple et bien commenté ci-dessous, et facile à copier-coller pour tests.

    Mon problème est que je voudrais bêtement parcourir une array et récupérer facilement les données les unes après les autres, et ça me semble "mission impossible" !

    Regardez :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    NUM=( 
    	"1" \
    	"2" \
    	"3" )
     
    echo "${#NUM}"
    # longueur de l'array -- affiche 1	
    echo A
     
    echo "${#NUM[*]}"
    # nbre d'éléments dans l'array -- affiche 3
    echo B1
     
    echo "${#NUM[@]}"
    # nbre d'éléments dans l'array -- affiche 3
    echo B2
     
    #for N in "${#NUM[*]}"
    #for N in "${#NUM[@]}"
    for N in $NUM
    do 
    	echo "${NUM[N]}"
    	# élément 'n' dans l'array -- affiche rien ou 2 avec 3e 'for'
    	echo C
     
    	echo $N
    	# affiche 3 ou 1 avec 3e 'for'
    	echo D
    done
    Et y a pas moyen d'avoir un truc aussi simple que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for N in "${#NUM[*]}"
    do 
        echo "${NUM[N]}"
    done
    qui afficherait
    1
    2
    3
    Comprends pas, là...
    Ok, j'ai dû louper une marche, alors si quelqu'un a une idée, merci à lui par avance
    Bon aprème,

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Je ne suis pas sûr de comprendre mais je ne vois pas l'une de ces deux possibilités dans tes propositions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    tab=( "11473" "12005" "12571" )
    echo ${#tab[@]}
     
    for i in $( seq ${#tab[@]} )
    do    
        echo ${tab[i-1]}
        wget -q -N "http://site.fr/podcast/fichier${tab[i-1]}"
        moulinette.sed -i "fichier${tab[i-1]}"
    done
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for i in ${!tab[*]} 
    do    
        echo ${tab[i]}
    done
    Tu y étais presque en fait. Il fallait parcourir (seq) et pas seulement donné le max.

    La seconde formule cherche les champs non nuls.

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Décembre 2012
    Messages : 43
    Par défaut
    si je ne me trompe pas, tu y étais presque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for N in "${NUM[*]}"
    do 
        echo "${N}"
    done
    le parcours du tableau se fait par élément dudit tableau et non par indice comme on peut en avoir l'habitude dasn d'autres langages.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    Jiheme44: non, ${#array[*]} retourne le nombre d'éléments du tableau, donc, dans for N, $N n'affichera que le nombre d'éléments du tableau !

    Jipété:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    array=(
       1
       2
       3
    )
    for ((i=0; i<${#array[@]}; i++))
    do
       echo "${array[i]}"
    done
    mais je n'en vois pas l'intérêt : les tableaux indexés ne sont pas hashés (contrairement aux tableaux associatifs), et donc ils restent dans l'ordre dans lequel ils sont assignés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    printf '%s\n' "${array[@]}"
    1
    2
    3
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour,

    Jiheme44 a raison, il est plus simple de manipuler une variable simple dans la boucle plutot qu'un tableau a indices. Cependant, c'est possible de la maniere suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    num=(1 2 3)
     
    for ((i=0; i < ${#num[*]}; i++))
    do
      echo ${num[i]}
    done
    Edit: Bon, grille par N_BaH

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Décembre 2012
    Messages : 43
    Par défaut
    Citation Envoyé par jmelyn Voir le message
    Bonjour,

    Jiheme44 a raison,
    oui et non
    il y avait un '#' en trop dans mon code.
    j'ai corrigé mon message précédent.

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 115
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 115
    Par défaut
    Bonsoir à tous,

    et un grand merci pour le coup de main

    J'opte pour
    Citation Envoyé par jmelyn Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    num=(1 2 3)
     
    for ((i=0; i < ${#num[*]}; i++))
    do
      echo ${num[i]}
    done
    Exactement ce qu'il me fallait !

    Impec, merci encore, et bonne soirée

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

Discussions similaires

  1. Problème parcours liste Array ?
    Par Baboulinet_ dans le forum Général Java
    Réponses: 9
    Dernier message: 05/10/2011, 09h23
  2. [VB-Excel]problème de syntaxe avec Array
    Par DomBourti dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 13/07/2006, 21h30
  3. [JSP] Problème pour passer un array comme paramètre
    Par MxPx_23 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 06/06/2006, 17h13
  4. Problème de parcours des champs dans l'ordre.
    Par jyms2006 dans le forum Access
    Réponses: 1
    Dernier message: 19/04/2006, 11h08
  5. [JSTL] Problème de parcours d'arbre en XML
    Par slashmax dans le forum Taglibs
    Réponses: 1
    Dernier message: 04/12/2005, 17h13

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