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

Administration système Discussion :

Gérer une base de données avec un script shell!


Sujet :

Administration système

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Par défaut Gérer une base de données avec un script shell!
    Salut à tous!

    J'ai un projet pour lequel je coince un peu, et j'ai besoin de votre aide.
    En fait je dois ecrire un script shell sh qui émule les fonctionnalites basiques d'une base de données, qui sera contenue dans un fichier nomé sh.db par exemple. Le script doit être écrit en sh et s'exécuter sous UNIX. Vu le délai très court pour rendre mon projet(ce weekend) et que je ne suis pas très callé en programmation shell, je viens vers vous.

    Voici les fonctionnalités demandées: Pouvoir insérer une clé dans le fichier via la commande(put) ./script.sh put <key> <valeur> (si la clé existe déjà la valeur est écrasée); supprimer une entrée de la base : ./script.sh del <key> <valeur>; afficher les valeurs qui matchent avec une expression(comme avec un grep): ./script.sh select <expr>; vider la base de donnees sans supprimer le fichier: ./script.sh flush; passer le fichier en parametre avec l'option -f; creer le fichier s'il est passe en parametre et n'existe pas. Donc le script prendra des options et des parametres; et les entrees sont juste Clé=Valeur.
    Pour l'insertion et la suppresion, rien ne dois être affiché à l'écran.

    J'ai donc defini mon format de base de donnees sous la forme : Clé | Valeur; une entrée par ligne du fichier.
    J'ai ensuite écrit mon parser d'option et les fonctions à appeler en fonction des options si la syntaxe est bonne.
    Là je bloque sur la fin de mon script.
    En fait pour ce script je ne dois utiliser que du sh et pas d'exécutable.
    Alors voici mon problème:

    Je ne peux pas ajouter les entrées en fin de fichier en faisant par exemple un echo "$key | $value" >> fichier.db, car cela ne vérifie pas l'existance de l'entrée et il y a des doublons dans les entrées de la bd; j'aimerais savoir par quelle commande interne au shell(builtin) je peux faire des check sur les lignes du fichier comme dans un tableau avant l'insertion, ceci me permettrait donc de bien gérer la commande "put" de mon sgdb(mon script).
    Pour la commande "del", il faut supprimer l'entrée sans produire aucun affichage, et si le nom de la clé est juste passé en argument sans sa valeur, la clé doit restée présente mais sans contenu. J'aimerais aussi dans la mesure du possible que vous m'aidiez à ce niveau.
    Pour le select il s'agit de recupérer l'expression passer en paramètres et lister toutes les valeurs de clés comportant des caractère de l'expression; de la même manière qu'un grep; seulement je n'ai pas droit au grep. Je ne sais pas si un "sed" ferais l'affaire....

    J'aimerai aussi savoir quelle builtin appeler pour la création du fichier le cas échéant, et comment supprimer tout le contenu du fichier sans le supprimer lui même.

    Enfin si vous avez pu répondre à mes préoccupation et que vous disposer encore d'un peu de temps, j'aimerais savoir procéder pour stocker la base de données dans le programme lui même et non plus dans un fichier externe; de quelle manière puis-je stocker les entrées et les manipuler dans ce cas? c'est une option que je devrais pouvoir gérer, mais la priorité est aux premières questions.

    Merci infiniment pour votre aide précieuse.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2006
    Messages : 107
    Par défaut
    En fait pour ce script je ne dois utiliser que du sh et pas d'exécutable.
    Echo, sed, grep, sont déjà des exécutables...

    Je ne peux pas ajouter les entrées en fin de fichier en faisant par exemple un echo "$key | $value" >> fichier.db, car cela ne vérifie pas l'existance de l'entrée et il y a des doublons dans les entrées de la bd; j'aimerais savoir par quelle commande interne au shell(builtin) je peux faire des check sur les lignes du fichier comme dans un tableau avant l'insertion, ceci me permettrait donc de bien gérer la commande "put" de mon sgdb(mon script).
    Pour savoir s'il y a des doublons, tu peux faire un Ensuite pour écraser une valeur, un coup de sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i "s#\(clef_de_recherche|\).*#\1$NEW_VAL#" tonfichierbdd.txt
    Pour la commande "del", il faut supprimer l'entrée sans produire aucun affichage, et si le nom de la clé est juste passé en argument sans sa valeur, la clé doit restée présente mais sans contenu. J'aimerais aussi dans la mesure du possible que vous m'aidiez à ce niveau.
    Pour supprimer une ligne, encore un coup de
    Pour supprimer juste la valeur, tu reprend la commande sed de remplacement, mais tu remplace la valeur par rien du tout pour l'effacer.

    Pour le select il s'agit de recupérer l'expression passer en paramètres et lister toutes les valeurs de clés comportant des caractère de l'expression; de la même manière qu'un grep; seulement je n'ai pas droit au grep. Je ne sais pas si un "sed" ferais l'affaire....
    Oui, avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/expression/p' tonfichierbdd.txt
    Par contre ça affiche la ligne complete, alors il te faut un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    | awk -F "|" '{print $2}'

    Pour créer un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    touch tonfichier
    ou echo "" > tonfichier
    pour l'écraser sans le supprimer:
    Bonne chance

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    Par défaut
    Bonjour,

    si tu ne l'as pas encore lu, regarde Comment lire/parcourir un fichier

    ajoute des test, ou [ ] (c'est pareil)
    redirige tout vers un fichier temporaire, puis écrase l'original (après l'avoir sauvegardé)
    ...
    ?

    edit: ah, tu ne peux pas utiliser cp, et mv
    mais tu peux stocker le contenu du fichier avec les modifications dans une variable, et,
    quand toutes les lignes (mais on peut s'arrêter avant) ont été lues, écrire cette variable dans le fichier tout en l'écrasant (c'est peut-être plus facile ainsi)
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Par défaut
    Merci infiniment pour vos reponses!

    Et justement il est possible d'utiliser des commandes certaines commandes externes, donc merci pour vos reponses.

    Par contre j'ai utilise getopts pour gerer mes options, ce qui est proscrit pour le projet. Auriez vous une alternative a me proposer pour gerer mes options courtes et longues (--)?

    Et aussi pour awk, ca fait partie des outils a ne pas utiliser.

    Merci encore pour collaboration

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    Par défaut
    j'ai utilise getopts pour gerer mes options, ce qui est proscrit pour le projet. Auriez vous une alternative a me proposer pour gerer mes options courtes et longues (--)?
    à coup de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while [ -n "$1" ]
    do case $1 in
          -o|--option) [ "${2::1}" != - ] && { shift; option="$1"; shift; }
          ;;
       ...
       esac
    done
    tu vois l'idée ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Par défaut
    Ouais je vois!

    J'ai recuperer toute la ligne dans un tableau avant le parsing d'ailleur , du coup je fais tout a la main.

    merci; je reviens si j'ai un souci.


    Merci encore.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2006
    Messages : 107
    Par défaut
    Citation Envoyé par sympaval Voir le message
    Et aussi pour awk, ca fait partie des outils a ne pas utiliser.
    n
    Pour remplacer le grep, tu as la commande sed au dessus qui te donne les ligne matchant ton expression.
    Si tu n'a pas droit à awk pour récupérer la partie à droite du caractère "|", tu peux utiliser

  8. #8
    Membre éclairé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Par défaut
    Salut les gars;

    Merci vraiment pour votre aide. Je suis pas très loin d'avoir complètement terminé mon projet.
    Mais j'ai quelques petits souci surement de syntaxe, puisque le script est teste sur sh(mais en fait c'est interprété en bash derrière).

    En fait la substitution ne marche pas bien avec l'utilisation du sed comme indique par apesle. C'est a dire, quand je fais un sed -i "s#\($KEY|\).*#\1$VALUE#" $db_file (ou db_file est la variable contenant mon nom de fichier; VALUE est la variable contenant la valeur qui doit remplacer la valeur de la clé) alors, l'entrée est bien écrasée mais elle garde sa valeur, c'est dire la ligne du fichier ne change pas. Du coup cela a un impact sur la suppression quand j'essaye de supprimer juste la valeur sans supprimer la clé. Donc quand je fais un sed -i "s#\($KEY|\).*#\1#" $db_file, ca ne marche pas, car la clé reste avec sa valeur.

    Aussi j'ai un petit souci pour gérer les argument passe sous forme de variable(avec un "$" devant). Ceci indique que si on a '$ke1' en argument, la valeur de l'argument sera égale au contenu de la clé.

    Par exemple dans si dans mon fichier sh.db j'ai au moment de l'exécution de la commande (avec "=" comme séparateur dans ce cas):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    clef1=valeur1
    clef2 = valeur2
    si on fait un ./bdsh.sh put '$clef1' '$clef2'

    On doit avoir dans le fichier aura dans ton sh.db
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    clef1=valeur1
    clef2 = valeur2
    valeur1=valeur2
    Voila un peu le blocus pour le moment; surtout au niveau de l'écrasement de la valeur qui ne marche pas trop avec le sed pour le moment. J'arrive pas a faire marcher avec toutes les syntaxes que j'ai utilisées, la valeur n'est jamais remplacée par la nouvelle valeur


    Merci infiniment pour votre aide!

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

Discussions similaires

  1. Réponses: 26
    Dernier message: 19/08/2015, 16h38
  2. Réponses: 1
    Dernier message: 10/01/2014, 09h09
  3. Créer une base de donnée avec un script
    Par roudani dans le forum Administration
    Réponses: 5
    Dernier message: 21/09/2011, 10h11
  4. [AC-2003] gérer une base de données avec des codes barres
    Par franklin59 dans le forum Modélisation
    Réponses: 1
    Dernier message: 09/12/2009, 15h21
  5. Réponses: 2
    Dernier message: 09/11/2009, 23h34

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