[fonction SCRIPT SHELL]

Fermé
fredo10 Messages postés 31 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 4 février 2006 - 10 janv. 2006 à 15:47
 eleve bis - 24 janv. 2008 à 12:14
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 .
A voir également:

8 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
15 janv. 2006 à 21:31
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
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
13 janv. 2006 à 20:40
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
Comme si ces personnes ne font pas comme leur copains profs (ils se reconnaitront ) ont fait avant eux...
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ca coute rien de demander un peu d aide car on peu pas vraiment dire que les cours le font...
1
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
10 janv. 2006 à 23:53
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
fredo10 Messages postés 31 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 4 février 2006 15
13 janv. 2006 à 17:41
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
fredo10 Messages postés 31 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 4 février 2006 15
15 janv. 2006 à 20:19
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