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 :

Comment utiliser les variables ?


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut Comment utiliser les variables ?
    Bonjour,

    Je viens tout droit du forum BBD, et j'ai un problème avec mon script en bash, et plus particulièrement les variables.

    Mon objectif est à partir d'un linux, de me connecter sur une base de donnée pour effectuer des requêtes.

    Pour cela, j'utilise l'outil FreeTDS pour me connecter à ma bbd via la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDSVER=7.0 tsql -H **** -p **** -U **** -P **** < test.sql
    Cette commande va se connecter et effectuer ce script en SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    USE GTB_MATMUT
    go
    declare @agence int
    select top 1 valeur from agence_capteur where id_agence = @agence and id_capteur = 10001 order by date_heure desc
    go
    exit
    Sauf que voila, j'aimerai que le "id_agence" soit une variable que je puisse modifier depuis ma commande.

    Pour cela j'ai créer un script en bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    # Argument
    agence=$1
     
    TDSVER=7.0 tsql -H **** -p **** -U **** -P **** < test.sql

    Je le lance via la commande via cette commande, mais je n'obtient aucun résultat... Pouvez-vous m'aider ?

    Ps : Dans la commande tsql, les variables sont définies via le "@" et non le "$".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    bash -x test.sh 4505
    + agence=4505
    + TDSVER=7.0
    + tsql -H **** -p **** -U **** -P ****
    locale is "fr_FR.UTF-8"
    locale charset is "UTF-8"
    using default charset "UTF-8"
    1> 2> 1> 2> 3> valeur
    1>

  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

    Quand tu envoies un fichier à une commande, il prend le fichier tel quel. Que tu définisses, avant ou après, des variables, lui fait une belle jambe.

    Il va donc falloir modifier le fichier texte à la volée.

    Je ne comprends pas l'intérêt de déclarer une variable @agence que tu ne définis jamais.
    Je fais donc l'hypothèse que ton @agence est juste une valeur fixe que tu as déterminée dans ton script bash par $agence.

    Ici, l'outil sed est suffisant. Avec une substitution de processus.

    Remplace dans ton script la ligne tsql par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDSVER=7.0 tsql -H **** -p **** -U **** -P **** < <(sed '/^declare @agence/d;s/@agence/'"$agence"'/g' test.sql)
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Je ne peux pas tester la solution proposée maintenant, mais je vais essayer d'expliquer mieux la chose

    En définitive, afin d'avoir accès à ma bdd je dois, dans un premier temps me connecter à celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDSVER=7.0 tsql -H **** -p **** -U **** -P ****
    Comme obtenir ma requête, j'ai connu un script sql...
    test.sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    USE GTB_MATMUT
    go
    select top 1 valeur from agence_capteur where id_agence = 4505 and id_capteur = 10001 order by date_heure desc
    go
    exit
    ... que je place directement dans ma commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDSVER=7.0 tsql -H **** -p **** -U **** -P **** < test.sql
    Maintenant, souhaite améliorer l'exploitation de ce script en en variable le "id_agence" pour effectuer des requêtes plus facilement.
    Pour placer des variables dans mon code SQL, je suis obligé de déclarer ma variable et de l'intégrer à ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    USE GTB_MATMUT
    go
    declare @agence int
    select top 1 valeur from agence_capteur where id_agence = @agence and id_capteur = 10001 order by date_heure desc
    go
    exit
    Malheureusement, avec la commande tsql il n'est pas possible de remplacer la variable directement dans la commande, comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDSVER=7.0 tsql -H **** -p **** -U **** -P **** < test.sql 4505
    C'est pour cela que je dois passer par un script bash afin de pouvoir remplacer le @agence par tous les numéros d'agence.

    J'espère que c'est plus clair pour vous.

  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
    Je maintiens que la solution proposée ci-dessus fonctionne.

    Maintenant, que faudra-t-il faire de la sortie ?
    Il est peut-être préférable de prendre la liste des id d'agences (dans un fichier), les modifier en requête SQL et envoyer le tout à "tsql".
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    En faite, tout cela servira à créer un plugin pour nagios (supervision réseau) d'où l'importance de pouvoir mettre une variable dans le champ "id_agence"

    Comme cela, je n'aurais plus qu'à renseigner le numéro d'agence pour que le script soit fonctionnel et que je puisse récupérer les valeurs souhaitées.

    Par contre, je ne comprends pas comment je peux remplacer le @agence de mon script SQL par un numéro d'agence via le sed
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDSVER=7.0 tsql -H **** -p **** -U **** -P **** < <(sed '/^declare @agence/d;s/@agence/'"$agence"'/g' test.sql)
    Dois-je remplacer $agence par le numéro d'agence ?
    Désolé je suis un peu perdu :/

  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
    Il n'y a plus rien à changer.

    Si ton script s'appelle ./mon_script.bash, il suffit de l'appeler comme ceci, et tout marche:

    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Effectivement c'est exactement le résultat que j'attendais !

    Dernière petite chose, voici le résultat que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    locale is "fr_FR.UTF-8"
    locale charset is "UTF-8"
    using default charset "UTF-8"
    1> 2> 1> 2> valeur
    3
    (1 row affected)
    1>
    Par contre j'aimerais seulement obtenir une valeur, dans ce cas précis le "3"
    Voici la commande que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk '/valeur/ { getline ; print }'
    Seulement je n'arrive pas à l’insérer dans la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDSVER=7.0 tsql -H **** -p **** -U **** -P **** < <(sed '/^declare @agence/d;s/@agence/'"$agence"'/g' | gawk '/valeur/ { getline ; print }' test.sql)
    NOTA : par contre je ne comprends pas à quoi sert le "<" dans "(sed", si je peux avoir une petit explication stp

  8. #8
    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
    Par contre j'aimerais seulement obtenir une valeur, dans ce cas précis le "3"
    Qu'est-ce qui caractérise la chose ? Est-ce LA ligne composée d'un unique nombre ? Est-ce toujours la 5ème ligne ? Autre ?

    Dans les 2 cas, utilise sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDSVER=7.0 tsql -H **** -p **** -U **** -P **** < <(sed '/^declare @agence/d;s/@agence/'"$agence"'/g' test.sql) |sed -n '/^[0-9]\+$/p'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDSVER=7.0 tsql -H **** -p **** -U **** -P **** < <(sed '/^declare @agence/d;s/@agence/'"$agence"'/g' test.sql) |sed -n '5p'
    NOTA : par contre je ne comprends pas à quoi sert le "<" dans "(sed", si je peux avoir une petit explication
    Les commandes ont un nom, des options, une ou des cibles, un canal d'entrée standard (numero 0), un canal de sortie standard (1), un canal de sortie d'erreur (2), etc.

    Dans ton exemple,
    • TDSVER=7.0 fixe une variable, juste pour l'exécution de la commande.
    • tsql est le nom de la commande
    • -H **** -p **** -U **** -P **** sont les options avec leur paramètre
    • < est la redirection d'un fichier dans l'entrée standard de la commande
    • <( ) est une substitution de processus. La sortie de la commande à l'intérieur des parenthèses sera considérée comme un fichier. Non disponible pour tous les interpréteurs de commande.
    • sed '/^declare @agence/d;s/@agence/'"$agence"'/g' test.sql) sed est le nom, ensuite vient le script sed, puis le fichier cible.
    • | Un pipe qui construit une conduite. La sortie standard de la première commande est reliée à l'entrée standard de la seconde. Cela évite la création de fichier temporaire.
    • sed -n '/^[0-9]\+$/p' Transformation appliquée au résultat de tsql
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Merci pour ces explications !

    La valeur que je souhaite isoler sera toujours précédé de "(1 row affected)" sur la ligne suivante.

    En définitive, il faudrait que je récupère la valeur qui se situe au dessus de la ligne "(1 row affected)"

  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 459
    Points
    13 459
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/affected/{g;p};h'
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Parfait,merci !!

    Par contre, petite question.
    Suis-je obligé de lancer le sed dans la commande ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./script_sql. sh 4505 | sed -n '/affected/{g;p};h'
    Ou, est ce qu'il y a la possibilité de l'insérer directement dans le sed du script ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <(sed '/^declare @agence/d;s/@agence/'"$agence"'/g' script_elec.sql)
    Dans le but de ne passer que la commande suivante :

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Bonjour,

    Voici une astuce qui utilise eval pour mettre directement une variable dans le fichier et que celle-ci soit modifier à la volée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ cat foobar.var
    toto=\"$foo\"
    titi=\"$bar\"
    $ bar="valx"
    $ foo="valy"
    $ while read A; do echo $A; done < <(eval "echo \"$(<foobar.var)\"")
    toto="valy"
    titi="valx"
    Ici, je donne un exemple pour une boucle while read, mais on peut la remplacer par la commande que l'on veut, exemple avec cat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ cat < <(eval "echo \"$(<foobar.var)\"")
    toto="valy"
    titi="valx"
    REMARQUE: on remarquera que si l'on veut conserver les guillemets, il faut les protéger dans le fichier lui-même, ceci est inhérent à echo
    Cordialement.

  13. #13
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Voici la syntaxe que ce que je cherchais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <(sed '/^declare @agence/d;s/@agence/'"$agence"'/g' script_elec.sql) | sed -n '/affected/{g;p};h'

  14. #14
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Un nouveau problème ce pose à moi...

    Voici le résultat que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./script_sql. sh 7607
    2
    1
    Ma question est la suivante : est-il possible de stocker ces valeurs dans deux variables différentes ? Et si possible de ne pas les stocker dans un autre fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
    agence=$1
    TDSVER=7.0 tsql -H **** -p **** -U **** -P **** < <(sed 's/@agence/'"$agence"'/g' script_elec.sql) |sed -n '/affected/{g;p};h'
    Merci par avance !

  15. #15
    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
    Est-ce que tu es sûr du nombre de lignes qui vont sortir ?

    Si oui, tu peux utiliser read.

    Mais je n'ai pas envie de répondre à cette question car tu sembles reparti dans l'usine à gaz.
    Ta/tes variables, tu vas en faire quoi, après ?

    Si c'est pour faire encore de la manipulation de fichier texte, prend bien en compte que tu peux tout faire avec grep/sed/awk/etc.

    On revient donc au point de départ: Quel est le besoin ? Le vrai besoin !
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  16. #16
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Sur ce script je suis sûr de mon nombre de sortie, à savoir 2. Cependant, je dois également créer d'autres script, avec plus de id_capteur donc le script doit être le plus exploitable possible

    Concernant l'objectif, c'est de se connecter à une table sql sous linux, de récupérer ces valeurs dans des variables, et de concevoir un script bash comportant ces variables pour les superviser sous Centreon.

    Finalement voici ce pour ce qui est de séparer les deux valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    myvar=$(TDSVER=7.0 tsql -H **** -p 1433 -U **** -P **** < <(sed 's/@agence/'"$agence"'/g' script_elec.sql) |sed -n '/affected/{g;p};h')
     
    general_elec=$(echo $myvar | cut -c1)
    CVC=$(echo $myvar | cut -c3)
    echo "general_elec = $general_elec"
    echo "CVC = $CVC"

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 08/04/2010, 14h48
  2. Réponses: 15
    Dernier message: 28/06/2007, 19h28
  3. Réponses: 3
    Dernier message: 09/01/2007, 09h44
  4. [2.0] Comment utiliser les variables de session ?
    Par batosai dans le forum ASP.NET
    Réponses: 11
    Dernier message: 03/05/2006, 15h49
  5. [VB]Comment utiliser les variables Windows?
    Par Furius dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 13/10/2005, 21h20

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