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 :

Commande echo et guillemets


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 120
    Par défaut Commande echo et guillemets
    Bonjour tout le monde. Mon problème est de quelqu'un débutant au Shell Linux

    Dans ces exemples, les mots 'coucou' et 'toi' sont séparés par plusieurs espaces (>1)

    1)
    Le shell traite l'entrée comme deux paramètres fournis à la commande echo (p1=coucou et p2=toi) d'où la sortie : coucou toi (avec un seul espace intermédiaire)

    2)
    Ici, on force le Shell à traiter l'entrée comme un seul paramètre, d'où la conservation de toutes les espaces dans la sortie (les espaces sont interprétés comme des caractères standards)


    Mais en mettant une variable intermédiaire, le fonctionnement se diffère et c'est ceci dont je ne comprends pas la raison.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var="coucou               toi" ;   echo $var
    La sortie Shell contient qu'un seul espace entre les deux mots comme si on a fourni deux paramètres à la commande echo
    Normalement, on devrait conserver toutes les espaces à cause de la présence des guillemets !
    Quelle est l'explication ? Merci

  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,

    UMQ!*
    il faut toujours mettre les développements de variables entre guillemets. TOUJOURS!
    à moins de savoir pourquoi.
    --
    *Use More Quotes!
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 120
    Par défaut
    Désolé, mais je ne comprends pas. C'est encore flou pour moi

    La variable var contient déjà des guillemets doubles, pourquoi je dois y ajouter des autres ?! ("$var"). Peux-tu m'expliquer en détail ce qui se passe dans les deux traitements : $var et "$var"

  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
    il ne faut pas confondre l'assignation (var="une variable") et le développement ("$var").

    on peut faire un parallèle avec printf (ou avec for) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ printf '%s\n' "$var"
    une        variable
    $ printf '%s\n' $var
    une
    variable
    avec des guillemets, printf considère n'avoir qu'un argument (comme tu l'as dit), alors que sans guillemets printf considère qu'il y a autant d'arguments que de mots (en fonction de l'IFS).
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 120
    Par défaut


    Dans l'expression echo $var (sans guillemets), le Shell va développer l'expression $var. Le symbole dollar indique qu'il faut chercher le contenu de la variable var. La valeur de v est construite auparavant à l'assignation où le Shell a déjà développé l'expression "coucou toi" et a interprété les espaces comme des caractères ordinaires et (non des séparations) à cause des guillemets doubles présentes. On fournit alors à la commande echo une expression dans laquelle les espaces sont déjà interprétés ce qui rend le découpage en deux paramètres quelque chose qui n'a pas de sens.

    Je vois les étapes du traitement comme ça. Où j'ai mal compris ?

  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
    au moment de l'assignation, le shell ne développe rien. On lui donne une chaîne, et il la garde au chaud.
    C'est lors du développement, s'il n'y a pas de guillemets, qu'il fait les ... développements.

    on a eu le cas il y a quelques jours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ ls -1
    monFichier.txt
    $ var=*.txt
    $ echo "$v" #où l'on voit ce que contient la variable
    *.txt
    $ echo $v #où l'on voit comment le shell développe le contenu de la variable
    monFichier.txt
    $
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

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