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 :

Récupération chaine en BDD qui contient des variables


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 Récupération chaine en BDD qui contient des variables
    Bonjour à tous,

    J'ai mis en place un script qui permet de m'envoyer des mails pour diverses informations.
    Avant j'avais tout écrit en dur dans le fichier sh (comme beaucoup d'autres batchs) mais ça c'était avant
    Je reprend pas mal de chose, et je met tout en BDD, comme ça si je veux modifier le sujet ou le corps d'un message, c'est vraiment plus pratique.
    Bref, voici ce que j'ai fait, j'ai créer une table mail dans laquelle j'ai mis trois colonnes, item, sujet et texte.
    Seulement voilà, dans le sujet et dans l'item je peux avoir une variable.
    Exemple, en BDD le sujet de mail est : "Bonjour $USER".
    Du coup avant de récupérer mes champs en BDD je déclare mon USER mais je ne le récupère pas après dans le shell.
    Voici ce que j'ai fait par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #Ma colonne en BDD est "Bonjour $USER"
    USER=Eric
    SUJET=`"$MY" -N -s -u "$RO" -p"$PASS" --database perso -e "SELECT sujet FROM mail WHERE item='Welcome';"`
    #Je récupère SUJET='Bonjour $USER'
    Et après la variable USER n'est pas remplacée, je suppose que ça vient des simples quotes qui sont automatiquement mis devant mais comment faire pour les virer ?
    Merci

  2. #2
    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 459
    Points
    13 459
    Par défaut
    Bonjour,

    1. Je ne vois pas ce qu'il y a de plus pratique à aller modifier une base de données plutôt que de modifier un bête fichier texte.
    2. Quelle est la question? Tu définis une variable USER que tu n'utilises jamais. Par contre tu utilises $RO que tu ne définis jamais.
    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
    Oui en fait "$MY", "$RO"et "$PASS" sont définies précédemment, ce sont la commande mysql, le compte root et le mot de passe de la BDD.

    En fait je veux utiliser USER.

    Quand je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUJET=`"$MY" -N -s -u "$RO" -p"$PASS" --database perso -e "SELECT sujet FROM mail WHERE item='Welcome';"`
    Je récupère cette valeur :

    Et j'aimerais que le fameux $USER soit remplacé par la valeur ci-dessus pour avoir :


  4. #4
    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 459
    Points
    13 459
    Par défaut
    D'abord, USER est une variable d'environnement. Elle est probablement déjà affectée. Mieux vaut prendre un autre nom de variable si besoin est.

    Ensuite, pourquoi ne pas utiliser sed?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ TOTO=tata
    $ s='Bonjour $TOTO'
    $ echo $s
    Bonjour $TOTO
    $ sed 's/$TOTO/'"$TOTO"'/g' <<< $s
    Bonjour tata
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    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
    Effectivement c'était une solution, mais je voulais savoir si il n'existait pas quelque chose de plus propre, qui pourrait "évaluer" la chaîne et trouver de lui même les variables...
    Si c'est pas possible autrement, je ferais avec sed

  6. #6
    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 459
    Points
    13 459
    Par défaut
    Faire évaluer, donc éventuellement, faire exécuter du code malicieux est-il plus propre qu'un remplacement textuel? Je ne suis pas sûr.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    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 459
    Points
    13 459
    Par défaut
    Pardon, j'ai oublié une solution bash qui peut te plaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo ${s//'$TOTO'/$TOTO}
    Bonjour tata
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    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
    Effectivement ça me va bien ça.
    Dernière question, comment faire plusieurs remplacement sur la même ligne ?
    Et si ce n'est pas possible, comment faire plusieurs remplacement les uns à la suite des autres ?
    Encore merci

  9. #9
    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 459
    Points
    13 459
    Par défaut
    Et bien normalement, la double barre // signifie justement "Tout remplacer". Sinon il n'y aurait qu'une simple barre "/" pour un seul remplacement.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    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
    Citation Envoyé par lokomass Voir le message
    je voulais savoir si il n'existait pas quelque chose de plus propre, qui pourrait "évaluer" la chaîne et trouver de lui même les variables...
    Si c'est pas possible autrement, je ferais avec sed
    Si: tu peux utiliser eval ... mais "eval is evil!"

    Avantage: il trouve automatiquement les variables à remplacer,
    mais, de toute façon, pour qu'elles aient une valeur, il faut bien s'en occuper individuellement.

    Inconvénient: si qqn met un cheval de Troie dans la base (genre $(rm -r /)), tu risques d'avoir des surprises désagréables...

    Pour faire plusieurs changements avec sed, l'option -g suffit.
    Pour remplacer plusieurs variables avec sed, tu peux faire, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    V1="valeur pour V1"
    V2="valeur pour V2"
    TEXTE=$("$MY" -N -s -u "$RO" -p"$PASS" --database perso -e "SELECT texte FROM mail WHERE item='Welcome';)
    TEXTE=$(echo "$TEXTE" | sed -e "s/\$V1/${V1}/g" -e "s/\$V2/${V2}/g"
    Avantage: sécurité (pas de cheval de Troie)
    clarté: toutes les variables sont clairement répertoriées

    Inconvénient: si quelqu'un met des accolades dans la base ${V1}, il faut prévoir le coup et l'ajouter dans le sed.
    Si une variable contient le caractère utilisé comme séparateur du substitute de sed, ça marche pas (ex: V1="3/4").
    Si 2 variables se ressemblent, ça peut ne pas faire ce que tu voudrais! Plus précisément, si l'une est un préfixe de l'autre et arrive en premier dans les remplacements de sed (par exemple, $V1 et $V10)

  11. #11
    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 459
    Points
    13 459
    Par défaut
    Surtout s'il se prémunit contre la demande de confirmation:
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

Discussions similaires

  1. Rempacer une chaine qui contient des "
    Par baime dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/10/2011, 07h58
  2. Réponses: 9
    Dernier message: 28/06/2011, 17h19
  3. comment fermer un site qui contient des framesets
    Par zana74 dans le forum Langage
    Réponses: 6
    Dernier message: 20/08/2006, 16h45
  4. insertin d'une chaine qui contient des guillemets
    Par karimspace dans le forum Access
    Réponses: 7
    Dernier message: 13/02/2006, 11h55
  5. Afficher sous Word des données SQL qui contient des retours
    Par samoht dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 30/09/2005, 16h12

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