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

  1. #21
    Membre habitué
    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
    Points : 130
    Points
    130
    Par défaut
    Re-Salut!

    En fait j'ai passe mon script a la moulinette de test, il passe presque tous les test sauf dans certains cas:

    -Je récupère mes argument dans tableau que je parcours pour le parsing et pour ce faire j'exécute ceci TAB_ARGS=( $(echo $*) ); mes arguments sont bien récupérés et tout marche bien auf quand on me passe un argument contenant un ou plusieurs espace. Dans ce cas le tableau prend chaque partie de l'argument séparée par des espaces, comme un une chaine a part, et ce parce que echo lui passe la liste des éléments tous séparés par des espaces et sans mette les "" autour des argument contenant les espaces.
    Donc par exemple un ./bdsh.sh put key1 "je fais un put", va ranger dans le tableau des arguments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    put
    key1
    je
    fais
    un
    put
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    put
    key1
    je fais un put
    Pour contourner cela, puisque je tiens a conserver mon tableau qui me facilite les manipulations, je fais ceci:
    TAB_ARGS[$#]=UFOS (pour déclarer mon tableau), pui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    echo -n "" > my.back
    while [ -n "$1" ] ; do
      echo "$1" >> my.back
      shift
    done
     
    i=0
    while read line
    do
        {
            echo -n ${ligne} > my_store
            read chaine < my_store
            TAB_ARGS=([$i]=$chaine)
            i=$((i+1))
        }
    done < my.back
    pour le remplir. Alors tout se passe bien
    Tout se passe bien dans les boucles, mes fichiers de stockage sont remplis et avec les ligne correspondants aux arguments, mais une fois sorti de la boucle ou je rempli mon tableau, celui est vide; car en fait il ne fait plus qu'une taille de 1 et contient juste la chaine vide "", et ce quelque soit le nombre d'arguments. Les test sur chaque itération montre bien que l'offset du tableau est bien set a chaque passage, et le fichier my.back contient exactement le nombre d'argument passer, sans segmenter les arguments contenant des espaces.
    Alors sortie de la boucle toutes ms variables ont leur valeur, sauf le tableau qui est vide. Et quel que soit la méthode employée, lorsque le tableau est remplie dans une boucle, son contenu n'est valable que dans cette boucle. Alors je pense quelque chose doit certainement m'échapper. J'aimerais utiliser mon tableau comme une variable globale a l'instar de toutes les autres variables

    - L'autre souci se situe au niveau de mon fameux select, j'utilise des fois un grep pour matcher des expression, mais quand l'expression en elle même est une option de la commande grep, ca foire non pas a cause de mon programme mais l'erreur est renvoyée par la commande grep elle même. Voici un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     value=`grep "$EXPR" store.txt | cut -d "|" -f 1`
    Si l'expression vaut "-e", ou "-v" ou toute autre chose je reçoit une erreur de grep. Je n'ai pas encore pu trouver la syntaxe qui ferais que grep voye l'expression comme un pattern et non comme une option.
    J'ai essaye comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     value=`grep -- "$EXPR" store.txt | cut -d "|" -f 1`
    Pour inhiber les options du grep lui même, mais je reçoit toujours l'erreur.

    -Le dernier point est bien celui de la protection du sed contre les caractères spéciaux auquel on a essaye de trouver une solution dans le précédent post. La syntaxe ne passe toujours pas.
    sedValue=$(echo "$Value" | sed 's/[\&\/]/\\&/g')
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sedValue="${Value//\\/\\\\}"
    sedValue="${sedValue//\&/\\&}"
    sed -i "s#\($Key|\).*#\1$sedValue#" $db_file
    Ça ne passe pas dans tous les cas.

    Je vous prie bien vouloir une fois de plus user de votre mobilité et votre générosité pour m'aider a peaufiner mon projet.

    Merci a tous.

  2. #22
    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 378
    Points
    19 378
    Par défaut
    voici trois exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ maFunc() { arr=( $* ); printf '%s\n' "${arr[@]}"; } # ce serait pareil avec $@
    $ maFunc foo 'bar baz' baz\ bar
    foo
    bar
    baz
    baz
    bar # autant d'arguments qu'il y a d'espaces
    $ maFunc() { arr=( "$*" ); printf '%s\n' "${arr[@]}"; }
    $ maFunc foo 'bar baz' baz\ bar
    foo bar baz baz bar # un seul argument
    $ maFunc() { arr=( "$@" ); printf '%s\n' "${arr[@]}"; }
    $ maFunc foo 'bar baz' baz\ bar
    foo
    bar baz
    baz bar
    # trois arguments
    cf. man bash /Paramètres spéciaux
    ça devrait résoudre le point 1 et 2, car plus de recours à /tmp/store.txt

    quant au point 3, , pour moi ça fonctionne.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #23
    Membre régulier
    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
    Points : 124
    Points
    124
    Par défaut
    Bonsoir,

    Pour ton 3iem point, ceci marche chez moi pour protéger la valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ echo "valeur_|_avec_&_caracteres_\_#_speciaux..." | sed 's#[\#\&|]#\\&#g'
    valeur_\|_avec_\&_caracteres_\\_\#_speciaux...
    indique de rechercher
    - # le caractère dieze car c'est le delimiteur du sed,
    - \ l'antislash, qui nest pas spécial dans une liste
    - le &, qui nest pas spécial dans cette partie du sed,
    - le caractere |, ton délimiteur

    Indique de remplacer par un anti-slash, suivi de l'expression matchant le pattern.


    Si tu veux protéger ta clef de recherche, c'est plus dur. Comme tu utilise sed pour remplacer le grep, je vois d'autre caractères spéciaux : ^, $ , [, -, ], *, ., \
    Cette commande marche, mais elle a quelques subtilités...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "clef_|_avec_&_^_$_*_._[a-z]_caracteres_\_#_speciaux..." | sed 's#[]^\#$\.*&|[-]#\\&#g'
    clef_\|_avec_\&_\^_\*_\._\[a\-z\]_caracteres_\\_\#_speciaux\.\.\.
    La position de certains caractères dans le pattern de recherche est importante !
    Pour plus d'info,

  4. #24
    Membre habitué
    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
    Points : 130
    Points
    130
    Par défaut
    Salut a tous!

    Merci pour vos reponses, mais on a oublie le "grep", ou je bloque encore. Pour le sed, je comprends qu'il faut chercher et ajuster a chaque utilisation.

    Mais la pour le grep, j'aimerais juste que lorsqu'il rencontre une expression semblable a une de ses options possibles(-v, -n, -e.....), qu'il ne renvoie pas d'erreur comme c'est le cas pour le moment, mais qu'il considere bien l'expression comme un patern de recherche.

    Si vous pouvez m'aider pour ce dernier cas du sujet, merci vraiment, je suis proche de l'heure de endu du projet.

    J'ai essayer `grep -- "$expression"` qui marche bien directement dans la console quelque soit l'expression passeer, mais des que je mets dans lefichier script ca ne marche pas.

    Merci .

  5. #25
    Membre régulier
    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
    Points : 124
    Points
    124
    Par défaut
    Bonsoir,

    Si ça marche en console, il n'y a pas de raison que ca ne marche pas en script ! Tu dois avoir une différence entre les deux..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    $ cat bdd.txt 
    tagada|tsoin
    piupiu|
    pif|pafpoum
    pe-e|tsoin
     
    $ cat test.sh
    #!/bin/bash
    expr="-e"
    res=$(grep -- "$expr" bdd.txt)
    echo $res
     
    $ ./test.sh
    pe-e|tsoin

  6. #26
    Membre habitué
    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
    Points : 130
    Points
    130
    Par défaut
    Ca doit vraiment se jouer au niveau de la syntaxe tout ca!

    En fait je vois que chez toi tu as mis la commande entre parenthese et ca passe.

    Or moi je mets tout entre simple cotte "`" et ca pourrait etre ca le probleme.

    Je verifie et je te fais signe.

    Merci

  7. #27
    Membre habitué
    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
    Points : 130
    Points
    130
    Par défaut
    Salut les gars!

    juste pour vous dire merci pour votre aide.

    J'ai réalisé a 98% mon projet et ce grâce a vous. J'ai surtout découvert beaucoup de coins caches du script shell.

    merci encore et a très bientôt

  8. #28
    Membre régulier
    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
    Points : 124
    Points
    124
    Par défaut

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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