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 :

Renvoyer un tableau depuis une commande


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut Renvoyer un tableau depuis une commande
    Bonjour,

    j'utilise une fonction qui me renvoie une liste via la création d'une variable que je peux réutiliser après.

    Je souhaiterai convertir cette fonction en une "vraie" commande.

    Mon soucis est de renvoyer une liste lorsque j'appelle la commande.

    Afin que je comprenne bien, simplifions la commande (qui n'a que peu d’intérêt mais bon :p ), on lui entre des valeurs, elle crée une liste avec et ne la renvoie que partiellement (genre les clés 1 et 3) :
    Il faudrait donc que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    variable=($(ma_super_commande oui non ouioui nononon)) 
     
    # Crée une liste mais ne doit me renvoyer que :
    # liste[1] qui vaut non
    # liste[3] qui vaut nonnon
     
    # Ainsi je devrais obtenir :
    echo "${variable[@]}"
    non nononon
     
    echo "${!variable[@]}"
    1 3
    j'arrive à renvoyer les textes via des echo mais comment faire pour qu'au final j'ai une liste avec conservation des clés ?

    Le but est bien évidemment qu'il n'y ait rien à faire pour l'utilisateur hormis appeler la fonction... (car oui on pourrait facilement boucler après coup dessus pour créer la liste).

    Merci à vous

  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
    J'ai rien compris

    que veux tu faire véritablement ?
    qu'est ce que "vraie commande" signifie ?
    exemple d'entrée et exemple de résultat attendu ?

    Merci

  3. #3
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    le terme "vraie" commande n'est pas en effet pas bon, c'est juste appeler un script au final mais dont je veux récupérer des informations.


    que veux tu faire ?
    exemple d'entrée et exemple de résultat attendu ?
    C'est ce que je pensais avoir fait...


    Comment récupérer un tableau en conservant ses clés et de ses valeurs depuis l'appel d'un autre fichier ?

    j'appelle ma super commande qui doit me renvoyer un tableau dans une variable donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    x=($(ma_super_commande))
     
    echo ${x[@]}
    valeur1 valeur3
     
    echo ${!x[@]}
    1 3
    Encore une fois, on se fiche de ce que fait la super commande car au final, je cherche à comprendre comment (et si c'est possible) récupérer un tableau et ce sans avoir rien à faire de particulier pour l'utilisateur.

    Mon but est d'eviter que l'utilisateur ait besoin de faire genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    x=($(ma_super_commande))
     
    echo ${x[@]}
    1:valeur1 3:valeur3
     
    y=()
    for elem in "${x[@]}"
    do
      y[${elem%%:*}]="${elem#*:}"
    done
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    x=()
    while IFS+=":" read num elem
    do
      # La commande me renvoie des lignes de type : Numero:Valeur
      x[${num}]="${elem}"
    done < <(ma_super_commande)
    Cela fonctionne mais demande du traitement post commande, ce que je voudrais vraiment éviter.

    En espérant avoir été plus clair... ( et que ce soit possible)

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

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

    un script accepte des paramètres "individuels", pas des tableaux.

    le seul "tableau" accessible par défaut dans un script est $@, qui contient la liste des tous les arguments du script.

    aqjs, il faudra parser la sortie de ta super commande pour y récupérer les informations.

    pour info, x=($(ma_super_commande)) est une mauvaise façon de faire, car le découpage de la sortie de la commande en éléments du tableau est fonction de l'IFS.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ maFonc() { echo "bla bla 'tra la la' \"la lère\"";}
    $ monTableau=( $(maFonc) )
    $ printf '%s\n' "${monTableau[@]}" 
    bla
    bla
    'tra
    la
    la'
    "la
    lère"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ maFonc() { echo "bla bla:tra la la:la lère";}
    $ IFS=':' monTableau=( $(maFonc) )
    $ printf '%s\n' "${monTableau[@]}" 
    bla bla
    tra la la
    la lère
    mais ça ne répond pas à ton interrogation.
    et pour pouvoir faire un while read line efficace, il faudrait que ta super commande affiche les informations ligne par ligne.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Ca doit être un super bordel dans ma tête XD
    du coup mes explications s'en ressentent.

    mon but n'est pas d'utiliser un while read ou quoi que ce soi derriere.

    Essayons autrement... mmmhhh :

    imaginons qu'un script fait tout un travail et doit me renvoyer un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # Il contient 2 valeurs
    echo ${Tableau[@]}
    oui non
     
    # il contient 2 clés mais pas 0 et 1 forcement...
    echo ${!Tableau[@]}
    0 5
    Je souhaiterait lorsque je fais appel à ce script via une commande type :
    obtenir le même résultat que ci dessus, c'est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    echo ${x[@]}
    oui non
     
    echo ${!x[@]}
    0 5
    Actuellement j'en suis à :
    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
    variable=()
    while read line
    do
      # Me renvoie les lignes :
      # 0:oui 
      # 5:non
      # Je traite les lignes afin de séparer la clé et la valeur
      variable[${line%%:*}]="${line#*:}"
    done < <(ma_commande)
     
    echo ${variable[@]}
    oui non
     
    echo ${!variable[@]}
    0 5
    J'ai donc bien le résultat escompté.

    Mais mon but est de supprimer tout le traitement présent ici et de le délocaliser dans ma fameuse commande afin qu'un appel à ma commande suffise à me renvoyer le résultat.

    Mais cela ne me semble pas possible...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 636
    Par défaut
    il me semble avoir bien compris.

    en deux mots : pas possible.

    un script ne renvoie pas un tableau, il affiche des données "brutes".
    et l'insertion dans un tableau de la sortie d'une commande n'en préserve pas l'apparent format tabulaire, puisqu'un script ne sort pas un tableau...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/04/2005, 14h22

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