[fonction SCRIPT SHELL]

fredo10 Messages postés 32 Statut Membre -  
 eleve bis -
salut tout le monde ,
je suis tout nouveau en script shell et j'aimerais avoir un coupt de main pour ecrire une fonction decrite comme suit:
nom de la fonction : put
description : il s'agit d'une fonction qui prend en parametre 2 arguments (<clef>=<valeur>) et qui les stocks dans un fichier sh.db qu'il cree automatique ment s'il n'existe pas deja.si une si une clef existe deja, sa valeur est remplacee par la nouvelle. merci d'avance .

8 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Re-

    Bon j'en profite pour rectifier une petite erreur que j'ai faite dans mon explication sur ton script...
    J'avais écrit :
    Et pour finir, même si la syntaxe était bonne, il faudrait pour enchaîner les commandes le caractère "&", et un autre "echo" :

    bla bla bla & echo $1 $2 >> $dbfile


    Mais il fallait lire :
    Et pour finir, même si la syntaxe était bonne, il faudrait pour enchaîner les commandes le caractère "&&", et un autre "echo" :
    bla bla bla && echo $1 $2 >> $dbfile
    Voilà pour la rectification ;-)

    Passons maintenant à ton problème.

    l'option -i de sed ne semble pas exister
    Si si elle existe, et elle marche aussi... enfin chez moi et chez d'autres d'ailleurs.
    Bon tu peux aussi passer par un fichier temporaire pour pallier le fait que la commande ne marche pas :
    [jp@Mandrake tmpfs]$ cat fichier.txt
    
    merci pour ton aide mais g kelkes soucis quand meme.
    l'option -i de sed ne semble pas exister et je ne
    comprends pas vraiment ce ke signifie cette condition :
    if [ "$?" -eq "0" ]; then
    merci de m'eclairer sur ces deux points.
    
    [jp@Mandrake tmpfs]$ cat fichier.txt | sed 's/then/alors/' > fich_temp.txt && mv -f fich_temp.txt fichier.txt
    
    [jp@Mandrake tmpfs]$ cat fichier.txt
    
    merci pour ton aide mais g kelkes soucis quand meme.
    l'option -i de sed ne semble pas exister et je ne
    comprends pas vraiment ce ke signifie cette condition :
    if [ "$?" -eq "0" ]; alors
    merci de m'eclairer sur ces deux points.
    
    [jp@Mandrake tmpfs]$

    je ne comprends pas vraiment ce ke signifie cette condition : if [ "$?" -eq "0" ]; then
    Alors "$?" c'est le code retour de la dernière commande exécutée. Autremant dit cette variable renferme (en général) soit "0" pour une exécution réussie (vraie) de la dernière commande, soit "1" pour une exécution non réussie (fausse) et "2" pour une erreur. Un exemple sera plus parlant :
    [jp@Mandrake tmpfs]$ who | grep jp  #jp est-il connecté ?
    jp       :0           Jan 15 08:38   #Oui sur le "display : 0" 
    
    [jp@Mandrake tmpfs]$ echo $?   #On affiche le code retour de la commande
    0
    
    [jp@Mandrake tmpfs]$ who | grep arthur   #arthur est-il connecté ?
    
    [jp@Mandrake tmpfs]$ echo $?
    1   #Ben non il ne l'est pas !
    
    [jp@Mandrake tmpfs]$ grep jp /etc/password
    grep: /etc/password: No such file or directory
    
    [jp@Mandrake tmpfs]$ echo $?
    2  #le fichier "password" n'existant pas, on a un code d'erreur en retour
    
    [jp@Mandrake tmpfs]$
    Pour en revenir à la syntaxe : if [ "$?" -eq "0" ]; then
    ben on teste tout simplement le code retour de la commande précédente, c'est à dire :
    "cat $DATABASE | grep "$1" > /dev/null"
    qui comme je te l'ai commentée dans le script, teste si la variable "$1" (le premier paramètre) existe dans la base de données ($DATABASE), et si c'est le cas, le code renvoyé est "0", sinon "1".
    Donc si le code renvoyé est égal à "zéro" ("$?" -eq "0"), on crée une variable contenant la "clé" et sa "valeur" pour les substituer par la valeur des "paramètres "$1" et "$2".
    Dans le cas contraire ou "$?" renverrait "1", on crée directement la clé et sa valeur que l'on ajoute au fichier :
    echo $1 $2 >> $DATABASE

    Ouf... c'est fini ;-))
    5
  2. lestate
     
    c est pas beau de demander aux autres de faire ses devoirs.Ce message s adresse aux etudiants qui ne veulent pas un -42 (ils se reconnaitront) ...
    4
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Bien, c'est très honorable de ta part de faire l'effort d'essayer de venir à bout de ton problème ;-)

    Alors il y a quelques incohérences dans ton script. On va essayer de voir ça ligne par ligne (en espérant avoir bien compris ce que tu voulais faire)...

    dbfile=sh.db
    Bon là tu crées ta variable contenant le nom de ta base de données. OK

    put()
    {

    Tu initialises ta fonction. OK

    if [ $1=cat dbfile | cut -d "=" -f1 ]
    Là il y a plusieurs erreurs :
    Tu veux comparer ton paramètre ($1) au résultat d'une commande.
    - Déjà pour que celà aboutisse il faut entourer ta commande de quotes inversées (`... `) (AltGr + 7 (du pavé "alphanumérique)).
    - Ensuite pour que ta variable soit interprétée il faut la faire précéder du signe "$" (dollar) => cat $dbfile
    - Le résultat du "cut" sera l'affichage de tous "champs 1" et à partir de là, difficile pour comparer un ensemble à un paramètre unique.

    then
    echo "`sed "/$1/d"$1=$2" >> dbfile

    Là aussi plusieurs erreurs...
    - Il manque une quote inversée à la fin de la commande "sed". De plus il manque aussi la source (le fichier sur lequel doit agir "sed".
    - Et pour finir, même si la syntaxe était bonne, il faudrait pour enchaîner les commandes le caractère "&", et un autre "echo" :
    bla bla bla & echo $1 $2 >> $dbfile
    elif [ $1 != cat dbfile | cut -d "=" -f1 ]
    echo "$1=$2" >> dbfile

    Là aussi, pas la peine de refaire une comparaison, et un simple "else" aurait suffit (puisque tu testes déjà dans la 1ère partie de la commande "if ... then").

    fi
    }

    La fin c'est bon ;-))
    A part qu'il manque l'appel à la fonction...
    put $1 $2
    Voilà. Allez vu ta bonne foi, je te donne ce que j'ai "pondu" (mais ce n'est pas la seule façon de faire, c'est une parmi d'autres, chacun voit ça à sa façon, et c'est loin d'être optimisé et parfait).

    #!/bin/bash
    # script_fonction_put.sh
    
    # Affectation des variables
    DATABASE="sh.db"
    
    # Création de la base de données
    # On teste l'existence de la base de données dans le répertoire courant
    # d'où a été lancé le script.
    if [ ! -f "$DATABASE" ]; then
           touch $DATABASE
    fi
    
    # On met en place la fonction
    function put
    {
    # La clé (paramètre $1) existe-t-elle ?
    # on liste le fichier, on filtre avec "grep" l'existence du paramètre
    # et on envoie le tout dans le néant (> /dev/null) pour éviter l'affichage
    # à l'écran
    cat $DATABASE | grep "$1" > /dev/null
    # si elle existe alors
    # ici on teste le code retour de la commande "grep"
    # renvoie "0" si vrai (autrement dit si le nom de la clé existe)
    # renvoie "1" si faux (si la correspondance de la clé n'a pas été trouvée)
    if [ "$?" -eq "0" ]; then
            # création de la variable de substitution
            # donc si la clé existe on la récupère ainsi que sa valeur dans
            # une variable pour s'en servir plus loin
            VAR=`grep "$1" $DATABASE`
            # substitution de sa valeur dans le fichier
            # on substitue à l'aide de "sed" les nouvelles valeurs aux anciennes
            # l'option "-i" de "sed" sert à écrire directement dans le fichier
            sed -i 's/'"$VAR"'/'"$1 $2"'/' $DATABASE
    else
            # sinon on crée la clé et sa valeur
            echo $1 $2 >> $DATABASE
    fi
    }
    
    # On lance la fonction avec les paramètres du script
    put $1 $2
    ;-))
    1
  4. cheel
     
    Comme si ces personnes ne font pas comme leur copains profs (ils se reconnaitront ) ont fait avant eux...
    1
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. eleve bis
     
    ca coute rien de demander un peu d aide car on peu pas vraiment dire que les cours le font...
    1
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Au lieu de demander que l'on te ponde un truc tout fait, si t'essayais de faire quelque chose de tes mimines et ensuite on voit ensemble ce qui cloche et à ce moment là si tu ne t'en sors pas, on peut envisager de te filer un coup de main, mais fait au moins l'effort d'apporter un semblant de contribution venant de ta part ;-))

    J'ai un truc sous la main là que j'ai pondu cet après-midi, mais ce ne serait pas un grand service que je te rendrai en te le filant.
    D'autant plus que ton truc c'est un devoir que tu dois rendre (cf ton autre post), et moi l'école y'a longtemps que je l'ai quittée et pourtant je paierai cher pour y retourner ;-))
    0
  8. fredo10 Messages postés 32 Statut Membre 15
     
    c'est vrai tu a tt a fait raison alors je te montre c ke j'ai pu fair jusque la :
    $dbfile=sh.db
    put()
    {
    if [ $1=cat dbfile | cut -d "=" -f1 ]
    then
    echo "`sed "/$1/d"$1=$2" >> dbfile
    elif [ $1 != cat dbfile | cut -d "=" -f1 ]
    echo "$1=$2" >> dbfile
    fi
    }
    0
  9. fredo10 Messages postés 32 Statut Membre 15
     
    merci pour ton aide mais g kelkes soucis quand meme.
    l'option -i de sed ne semble pas exister et je ne comprends pas vraiment ce ke signifie cette condition : if [ "$?" -eq "0" ]; then
    merci de m'eclairer sur ces deux points.
    0