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 :

Parser un argument de commande en plusieurs


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 50
    Par défaut Parser un argument de commande en plusieurs
    Bonjour,

    Je rencontre quelques difficultés pour parser un argument d'une ligne de commande en plusieurs.
    Je m'explique, j'ai un script shell qui effectue certains traitements et qui prend en argument plusieurs paramètres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./script.ksh arg1 arg2 arg3 arg4
    Les arguments 1 et 2 sont fixes.
    L'argument n°3 se présente sous la forme suivante var1:var2:var3:...:varn et est variable, c'est à dire que l'utilisateur peut mettre var1 ou var1:var2 ou var1:var2:var3. Le symbole '|' est le champ de séparation. L'argument 4 est optionnel.

    Je voudrais parser l'argument 3 et stocker les différentes valeurs dans une variable de tableau. Par exemple var1:var2:var3 j'aurai tab[1]=var1, tab[2]=var2 et tab[3]=var3.

    J'ai essayé d'utiliser la commande AWK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    argument = $4
    tab = `echo $argument | awk 'BEGIN{FS=":"}{for (i=1; i<=NF; i++) tab[i]=print $i}'`
    Le tableau reste vide tout le temps, par contre si je fais un echo $tab je me retrouve avec var1 var2 var3 mais ce n'est pas ce que je veux.

    Avez-vous des pistes ? Il y a t-il une solution plus facile pour parser un argument de ligne de commande en plusieurs et les stocker pour les réutiliser ?

    Merci pour votre aide

  2. #2
    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,

    simplement en modifiant temporairement l'IFS, et en utilisant un tableau.

    en ce qui concerne ksh, il est utile de préciser la version que tu utilises : 88, 93, pdksh, autre...

    en ksh93 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    arg3="$3" #$3 = var1:var2:var3
    oIFS="$IFS"
    IFS=":"
    array=( $arg3 )
    printf '%s\n' "${array[@]}"
    var1
    var2
    var3
    IFS="$oIFS" #ne pas oublier de restaurer l'IFS !
    ...
    ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 50
    Par défaut
    Merci pour ta réponse.

    Quand j'ai mis var1:var2:var3 c'était un exemple, ça se peut qu'il y ait plus de variables (var1:var2:var3:var4:var5:var6) ou bien moins (var1:var2) or avec ta solution il me semble que ce n'est pas le cas. C'est pour cela que j'avais opté pour la commande AWK avec une boucle for qui parcourt l'argument 3.
    Je me trompe ?
    PS:concernant la version, il s'agit bien de ksh93.

    Merci

  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
    le tableau se remplit de tous les éléments de $3 séparés par deux-points; il n'y a pas de limite (±).
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 50
    Par défaut
    D'accord, merci .
    Juste par curiosité,
    - Il n'y a que la solution de l'IFS ?
    - La méthode sur laquelle j'étais parti (AWK) ne permet pas de réaliser ce dont j'avais besoin ou la syntaxe n'était tout simplement pas la bonne ?


  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
    la syntaxe n'est pas correcte, et ce n'est pas la bonne façon de faire.
    pour ce que j'en sais, les éléments du tableau seront définis par l'IFS de toutes façons.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 50
    Par défaut
    Ok, merci

  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 Aiglon13 Voir le message
    - Il n'y a que la solution de l'IFS ?
    Tu peux t'embêter avec un "sed" via un pipe si tu ne veux pas utiliser le changement d'IFS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ A=var1:var2:var3
    $ echo ${A}
    var1:var2:var3
    $ array=( $(echo ${A} | sed 's/:/ /g') )
    $ printf '%s\n' "${array[@]}"
    var1
    var2
    var3
    $
    Mais bon ça suppose que ton argument ne comporte déjà pas d'espace à l'origine sans quoi


  9. #9
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 50
    Par défaut
    Solution efficace également, je prends merci
    A+

  10. #10
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 50
    Par défaut
    Re,

    J'ai une erreur de syntaxe par contre au lancement du script (syntax error: `(' unexpected) provenant de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array=($(echo ${A} | sed 's/:/ /g'))
    Je crois savoir d'où cela vient.
    En effet, en tête de mon script j'ai : #!/bin/ksh
    Si je modifie en #!/bin/bash ça marche.
    Or je dois utiliser absolument #!/bin/ksh pour le reste de mon script.

    Comment gérer les tableaux avec KSH dans ce cas précis ?

    Merci

  11. #11
    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
    Re-

    Il faut déclarer le tableau avec 'set -A tableau' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ A=var1:var2:var3
    $ set -A array $(echo ${A} | sed 's/:/ /g')
    $ printf '%s\n' "${array[@]}"
    var1
    var2
    var3
    $

  12. #12
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 50
    Par défaut
    Parfait
    +1

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/11/2008, 11h41
  2. Commande avec plusieurs type de produit
    Par jeffciara dans le forum Schéma
    Réponses: 3
    Dernier message: 06/02/2008, 19h26
  3. [Apis]parser les arguments d'un programme Java
    Par sacofan dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 06/08/2005, 14h32
  4. [OCaml] Parser une ligne de commande
    Par Thanatos dans le forum Caml
    Réponses: 4
    Dernier message: 10/12/2004, 10h11
  5. Réponses: 4
    Dernier message: 03/12/2004, 11h18

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