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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    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 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    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 635
    Détails du profil
    Informations personnelles :
    Localisation : France

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


+ 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