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 :

Passer des arguments à une commande


Sujet :

Shell et commandes GNU

  1. #1
    Membre expérimenté
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Par défaut Passer des arguments à une commande
    Salut à tous

    J'aimerais avoir des exemples où passer des arguments à une commande en passant par une chaine de caractère pose problème.
    Par exemple, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    _tcpdump_default_args="-i $INTERFACE -q -l -n"
    _tcpdump_default_filter="host $(net.ip.private) and (tcp[13]==2 or icmp or udp)"
     
    tcpdump "$_tcpdump_default_args" "$_tcpdump_default_filter"
    Quelle est le problème avec cette aproche ?
    cela m'aiderai à comprendre.

  2. #2
    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
    le problème est que c'est "monolithique" : des arguments qui devraient être séparés sont passés comme un seul arguments, entre guillemets.

    en bash, on a la possibilité d'utiliser un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ _tcpdump_default_args=( -i $INTERFACE -q -l -n )
    $ _tcpdump_default_filter=( host "$(net.ip.private)" and (tcp[13]==2 or icmp or udp) )
    $
    $tcp "${_tcpdump_default_args[@]}" "${_tcpdump_default_filter[@]}"
    les guillemets autour du développement des tableaux préservent les différents éléments des tableaux*, sans conférer aux tableaux la constitution "monolithique" de variables "plates".

    --
    * avec @, pas avec * :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ ar=( a 'b c' d )
    $ printf '%s\n' "${ar[@]}"
    a
    b c
    d
    $ printf '>%s<\n' "${ar[*]}"
    >a b c d<
    $
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par yacinechaouche Voir le message
    Quelle est le problème avec cette aproche ?
    cela m'aiderai à comprendre.
    Fais ça avec un exemple plus simple: essayons "ls -l -a" avec "-l -a" en string : args="-l -a".
    A partir de là, ceci ls "$args" ne fonctionne pas mais cela ls $args fonctionne.
    C'est vrai que j'ai dit récemment que les strings doivent être quotées mais c'est quand on veut regrouper plusieurs mots séparés par des espaces en une unique string.
    Dans ton cas présent, c'est l'inverse que tu veux faire => faire en sorte que la string contenue dans l'argument soit vue par la commande comme deux mots distincts => là les guillemets ne se mettent plus car au contraire ils bloquent le shell qui ne peut plus les séparer pour les transmettre sous forme séparée à ladite commande.

    Ceci dit, j'ai pas mal programmé en shell, mais jamais je n'ai eu à faire cela. Si je dois appeler tcpdump avec les options "-i $interface", "-q", "-l", et "-m", j'écrirai directement tcpdump -i "$interface" -q -l -m.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Passer des arguments à une classe de test Junit
    Par safi11 dans le forum Général Java
    Réponses: 8
    Dernier message: 03/01/2012, 15h30
  2. Passer des arguments à une JRDataSource custom
    Par blured dans le forum iReport
    Réponses: 1
    Dernier message: 11/02/2010, 18h24
  3. passer des arguments depuis un lien hypertxte vers une page php
    Par killer_instinct dans le forum Langage
    Réponses: 5
    Dernier message: 28/04/2007, 12h18
  4. Comment passer des arguments en ligne de commande?
    Par Razgriz dans le forum NetBeans
    Réponses: 1
    Dernier message: 11/04/2007, 11h11
  5. passer des argument d'une page à une autre
    Par awatif dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 21/09/2006, 12h41

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