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 :

Retours chariots fin de variable


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut Retours chariots fin de variable
    Bonjour à tous.

    J'ai une chaîne de caractère récupérée en BDD :

    J'ai une fonction remetVariables, qui me permet de sortir ma chaîne en remplaçant certaines valeurs dedans.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function remetVariables
    {
    	STRING=`echo "$1" | sed "s/#/\n/g"`
    	STRING=$(echo "${STRING//'$NAS'/$NAS}")
    	STRING=$(echo "${STRING//'$3'/$3}")
    	STRING=$(echo "${STRING//'$4'/$4}")
    	echo "$STRING"
    }
    Et j'appelle cette fonction comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TEXTE=$(remetVariables "$S" null chaine caractere)
    Le souci c'est que maintenant les retours charriots en fin de variable sont perdus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    bash-3.2$ echo "$TEXTE"
     
    ma chaine
     
    de caractere
    bash-3.2$
    Moi j'aimerais qu'il les gardent !! Comment faire svp ?

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

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

    c'est l'opérateur $() ou `` qui fait disparaître tes retours à la lignes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function remetVariables
    {
    	STRING=$(echo "${STRING//'$NAS'/$NAS}")
    	STRING=$(echo "${STRING//'$3'/$3}")
    	STRING=$(echo "${STRING//'$4'/$4}")
            sed "s/#/\n/g" <<< "$STRING""
    }
    (non testé, pour des raisons évidentes)
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    Merci, en effet j'ai bien vu que le souci venait de là.
    Mais j'ai quand même besoin de faire une redirection dans une variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TEXTE=$(remetVariables "$S" null chaine caractere)
    Comment contourner dans ce cas me $() / `` ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    As-tu essayé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TEXTE="$(remetVariables "$S" null chaine caractere)"

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 712
    Points
    12 712
    Par défaut
    Bonjour,
    Déjà, il faudrait corriger les autres erreurs, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function remetVariables
    {
    	#Pour remplacer la partie sed, ici on utilise le echo -e pour interpréter le "\n"
    	STRING=$(echo -e "${1//#/\n}")
    	#Pas besoin de echo sauf si tu dois interpréter des caractère d échappement ("\t","\n",..) et dans ce cas ne pas oublier le '-e'    
    	STRING="${STRING//\$NAS/$NAS}"
    	STRING="${STRING//\$3/$3}"
    	STRING="${STRING//\$4/$4}"
    	echo "$STRING"
    }
    J'ai aussi remplacé les '$NAS' '$3' '$4' par \$NAS \$3 \$4 car je suppose que ton but est de remplacer par exemple la chaine "$3" par la valeur de la variable $3, ce qui ne se faisait pas avec la syntaxe initial (le simple quote dans une chaine de caractère n'est qu'un simple caractère).
    Cordialement.

  6. #6
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    Merci jack, mais même chose,
    Disedorgue, si je mets ta fonction voici le résultat, pas d'espace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    bash-3.2$ remetVariables "$S" null chaine caractere
     
    ma chaine
     
    de caractere
    bash-3.2$

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Es-tu sûr que ta chaîne S finit par 2 croisillons?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    il n'y a semble-t-il pas de solution : la substitution de commande "bouffe" les multiples retours à la ligne finaux.

    un contournement consisterait à ajouter un caractère pas, ou peu, utilisé (§ par exemple), et de le supprimer après la dernière substitution de commande.
    ???
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 712
    Points
    12 712
    Par défaut
    Si on ne fait que afficher le résultat, cela peut fonctionner en trichant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     function remetVariables {
     STRING="${1//#/\n}"
     STRING="${STRING//\$NAS/$NAS}"
     STRING="${STRING//\$3/$3}"
     STRING="${STRING//\$4/$4}"
    printf "$STRING"; }
    Par contre dés que l'on met le résultat dans une variable, il tronque les "\n" finaux.
    Une autre solution, c'est de ne pas interpréter les "\n":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     function remetVariables {
     STRING="${1//#/\n}"
     STRING="${STRING//\$NAS/$NAS}"
     STRING="${STRING//\$3/$3}"
     STRING="${STRING//\$4/$4}"
    printf "%s" "$STRING"; }
    et dans ce cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ echo $S
    #ma $3##de $4##
    $ XX=$(remetVariables "$S" null chaine caractere)
    $ echo -en "$XX"
     
    ma chaine
     
    de caractere
     
    $
    Cordialement.

  10. #10
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    La dernière solution me convient parfaitement puisqu'au final j'envoie un mail avec cette commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo -e "$TEXTE" | "$NAIL" -s "$SUJET" "$ADRMAIL"
    Du coup je faisais déjà le "echo -e", merci beaucoup !

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    A ce moment-là, la question est: pourquoi vouloir mettre un fichier entier dans une variable ?..

    La "bonne pratique" me semble être d'avoir un fichier contenant ton mail tout fait et un sed simple pour remplacer le texte de ton fichier.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 712
    Points
    12 712
    Par défaut
    Sinon, la solution en bash pour récupérer les retour à la ligne finaux dans une variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ type remetVariables
    remetVariables est une fonction
    remetVariables ()
    {
        STRING="${1//#/\n}";
        STRING="${STRING//\$NAS/$NAS}";
        STRING="${STRING//\$3/$3}";
        STRING="${STRING//\$4/$4}";
        printf "$STRING"
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ remetVariables "$S" null chaine caractere
     
    ma chaine
     
    de caractere
     
    $
    Si on ne fait qu' afficher, on a bien les retours finaux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ XX=$(remetVariables "$S" null chaine caractere)
    $ echo -e $XX
     
    ma chaine
     
    de caractere
    $
    Ici, il manque les retour finaux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ IFS= read -d '' XX < <(remetVariables "$S" null chaine caractere)
    $ echo -e $XX
     
    ma chaine
     
    de caractere
     
     
    $
    Ici, on a bien les retours finaux
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    mais pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo -e "$TEXTE" | "$NAIL" -s "$SUJET" "$ADRMAIL"
    et pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    remetVariables "$S" null chaine caractere | "$NAIL" -s "$SUJET" "$ADRMAIL"
    simplement ?

    ah, si seulement on savait tout dès le début !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    Parce que jai 3 serveurs et qu'en fonction de ce dernier la variable TEXTE n'est pas la meme

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Certes. Et la variable TEXTE, elle est alimentée par quoi ? Un fichier j'imagine. Elle n'est quand même pas écrite en dur dans le script.

    Sous Unix, tout est fichier. Mais dans quelques discussions en ce moment, tout est dans des variables.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    Citation Envoyé par lokomass
    [...]jai 3 serveurs et [...] en fonction de ce dernier la variable TEXTE n'est pas la meme
    mais la fonction reste la même, non ?!
    c'est le principe d'une fonction : quelle que soit l'entrée, le traitement, lui, est toujours identique.
    c'est "$S" qui change en fonction du serveur.

    Citation Envoyé par Flodelarab
    Et la variable TEXTE, elle est alimentée par quoi ? Un fichier j'imagine. Elle n'est quand même pas écrite en dur dans le script.
    quant à stocker du texte, en dur, dans le script, ça ne me choque pas plus que ça.
    ça peut éviter d'avoir des scripts qui ne fonctionnent plus parce qu'ils ne trouvent pas le fichier de données.
    surtout si ce sont des données fixes que l'utilisateur n'a pas à modifier.
    ???
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  17. #17
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 712
    Points
    12 712
    Par défaut
    J' en rajoute une petite couche:

    La variable TEXTE est le contenu du résultat de la fonction. La seule variable alimenter par un processus externe (et donc potentiellement par un fichier) est la variable S (ici retour d'un requête SQL) à ce qu'il dit dans le premier post.
    Cordialement.

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

Discussions similaires

  1. retour chariot fin de fichier
    Par vince2005 dans le forum Langage
    Réponses: 11
    Dernier message: 16/04/2014, 01h11
  2. Réponses: 2
    Dernier message: 08/07/2011, 10h01
  3. [PHP 5.3] Un retour chariot dans une variable
    Par Ottakar dans le forum Langage
    Réponses: 9
    Dernier message: 01/11/2010, 22h40
  4. Détecter le retour chariot d'une variable post
    Par keub51 dans le forum Langage
    Réponses: 1
    Dernier message: 22/05/2007, 17h05
  5. Retour chariot appliquée à une variable
    Par denis finch dans le forum Langage
    Réponses: 4
    Dernier message: 14/12/2005, 12h07

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