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 :

Affectation de plusieurs variables en même temps


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Homme Profil pro
    consultant ETL
    Inscrit en
    Septembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : consultant ETL
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2008
    Messages : 97
    Points : 185
    Points
    185
    Par défaut Affectation de plusieurs variables en même temps
    Bonjour,

    J'ai un souvenir, mais peut être me trompe-je...
    Peux ton affecter des valeurs à plusieurs variables en une commande. Voici mon souvenir, une commande qui ressemblerait à ceci :

    echo "toto titi" | read A B

    Le but étant que la chaîne "toto" soit stockée dans la variable A et "titi" dans B.
    En l’occurrence, aujourd'hui, ma commande read ne fait pas ce que j'attend, mes variables sont vides.
    Auriez vous une idee sur mon problème?

    merci pour votre aide.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    Bonjour,

    Citation Envoyé par qqcvd
    ma commande read ne fait pas ce que j'attend, mes variables sont vides
    en fait si, mais seulement dans le sous-shell créé par le pipe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "toto titi" | { read A B; echo "$A";}
    toto
    pour t'aider vraiment, il faut nous dire quel shell tu comptes utiliser, d'où vient "toto titi"...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par qqcvd Voir le message
    echo "toto titi" | read A B

    Le but étant que la chaîne "toto" soit stockée dans la variable A et "titi" dans B.
    En l’occurrence, aujourd'hui, ma commande read ne fait pas ce que j'attend, mes variables sont vides.
    Auriez vous une idee sur mon problème?
    C'est une méthode non portable car son comportement est laissé au libre choix des implémentations de shell par POSIX.

    Elle fonctionne en ksh mais pas avec bash, du moins pas par défaut. Il est possible de configurer bash pour que le comportement soit celui attendu, mais il faut désactiver le job control, on se demande pourquoi ... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ echo toto titi | read A B
    $ echo $A
    $ shopt -s lastpipe 
    $ set +m
    $ echo toto titi | read A B
    $ echo $A
    toto
    ɹǝsn *sıɹɐlos*

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    Citation Envoyé par jlliagre
    Elle fonctionne en ksh[...]
    pas avec toutes les versions de ksh : ksh93 oui, mais pas les autres ([lm]ksh,pdksh)
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    pas avec toutes les versions de ksh : ksh93 oui, mais pas les autres ([lm]ksh,pdksh)
    Ce comportement est celui de toutes les versions de ksh depuis sa creation (ksh88, ksh93, wksh, dtksh).
    Les clones de ksh, qui ne sont pas des versions de ksh mais des réimplémentations n'ont pas repris cet fonctionnalité.
    ɹǝsn *sıɹɐlos*

  6. #6
    Membre habitué
    Homme Profil pro
    consultant ETL
    Inscrit en
    Septembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : consultant ETL
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2008
    Messages : 97
    Points : 185
    Points
    185
    Par défaut !!
    Merci !!

    voilà, c'est donc cela, avant je bossais sur KSH sous HP-UX ou AIX.
    en ce moment j ai du BASH sur UBUNTU.

    J'ai voulu essayer la proposition de jlliagre
    mais cette option n'existe pas dans mon BASH. J'ai uniquement cette liste d'option
    hduser@PSD-HADOOP01:~/SBI$ shopt -s lastpipe
    -bash: shopt: lastpipe : nom d'option du shell non valable
    hduser@PSD-HADOOP01:~/SBI$ shopt
    autocd          off
    cdable_vars     off
    cdspell         off
    checkhash       off
    checkjobs       off
    checkwinsize    on
    cmdhist         on
    compat31        off
    compat32        off
    compat40        off
    dirspell        off
    dotglob         off
    execfail        off
    expand_aliases  on
    extdebug        off
    extglob         on
    extquote        on
    failglob        off
    force_fignore   on
    globstar        off
    gnu_errfmt      off
    histappend      on
    histreedit      off
    histverify      off
    hostcomplete    off
    huponexit       off
    interactive_comments    on
    lithist         off
    login_shell     on
    mailwarn        off
    no_empty_cmd_completion off
    nocaseglob      off
    nocasematch     off
    nullglob        off
    progcomp        on
    promptvars      on
    restricted_shell        off
    shift_verbose   off
    sourcepath      on
    xpg_echo        off
    

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bonjour,

    Tu peux aussi utiliser une autre syntaxe (moins posix), voici 2 exemples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ echo "$B et $A"
     et
    $ read A B <<<"titi tata"
    $ echo "$B et $A"
    tata et titi
    $ read A B < <(echo "toto tutu")
    $ echo "$B et $A"
    tutu et toto
    $
    Cordialement.

  8. #8
    Membre habitué
    Homme Profil pro
    consultant ETL
    Inscrit en
    Septembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : consultant ETL
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2008
    Messages : 97
    Points : 185
    Points
    185
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    Tu peux aussi utiliser une autre syntaxe (moins posix), voici 2 exemples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ echo "$B et $A"
     et
    $ read A B <<<"titi tata"
    $ echo "$B et $A"
    tata et titi
    $ read A B < <(echo "toto tutu")
    $ echo "$B et $A"
    tutu et toto
    $

    merci, je vais utiliser ceci, mais je ne comprends pas très bien comment ça fonctionne. Aurais tu un lien qui explique ces méthodes?

  9. #9
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par qqcvd Voir le message
    voilà, c'est donc cela, avant je bossais sur KSH sous HP-UX ou AIX.
    en ce moment j ai du BASH sur UBUNTU.

    J'ai voulu essayer la proposition de jlliagre
    mais cette option n'existe pas dans mon BASH.
    Ah oui, l'option lastpipe n'est apparue qu'à partir de la version 4.2 de bash (2011), ton Ubuntu ne dois pas être très récent.

    Si tu as des problèmes pour comprendre les suggestions de disedorgue, voici une solution de contournement POSIX, remplacer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo toto titi | read a b
    echo $a
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    echo toto titi > /tmp/tmp.$$
    read a b < /tmp/tmp.$$
    rm /tmp/tmp.$$
    echo $a
    ɹǝsn *sıɹɐlos*

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour,

    Méfiance. Si je me souviens bien, la dernière variable affectée par read récupère tout le reste.
    Pour être sûr de ne trouver que "toto" en "a" et "titi" en "b", je rajouterais un champ c.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "toto titi" | { read a b ; echo "a=$a b=$b c=$c"; }
    a=toto b=titi c=
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Citation Envoyé par qqcvd Voir le message
    merci, je vais utiliser ceci, mais je ne comprends pas très bien comment ça fonctionne. Aurais tu un lien qui explique ces méthodes?
    Pas trop de lien là-dessus à part la doc officielle:
    pour le <(....):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $info bash --index-search="Process substitution"
    pour <<< (partie 3.6.7 Here Strings):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $info bash --index-search="Redirection"
    Cordialement.

  12. #12
    Membre habitué
    Homme Profil pro
    consultant ETL
    Inscrit en
    Septembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : consultant ETL
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2008
    Messages : 97
    Points : 185
    Points
    185
    Par défaut
    parfait, en cherchant "Process substitution" et "Here Strings" dans le man bash , j'ai effectivement trouvé.


    Merci à tous!

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

Discussions similaires

  1. [AC-2007] affecter une valeur à plusieurs champs en même temps
    Par pepper18 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 21/01/2010, 11h11
  2. déclarer plusieurs variables en même temps
    Par piotrr dans le forum Général Python
    Réponses: 2
    Dernier message: 06/04/2007, 14h22
  3. laisser cochés plusieurs TRadioButton en même temps.
    Par heider dans le forum Composants VCL
    Réponses: 5
    Dernier message: 25/12/2005, 14h15
  4. lecture de plusieurs port en même temps
    Par manaboko dans le forum Langage
    Réponses: 3
    Dernier message: 06/10/2005, 15h26
  5. Réponses: 9
    Dernier message: 17/04/2004, 16h32

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