[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
eleve bis - 24 janv. 2008 à 12:14
A voir également:
- [fonction SCRIPT SHELL]
- Fonction si et - Guide
- Script vidéo youtube - Guide
- Classic shell windows 11 - Télécharger - Personnalisation
- Fonction moyenne excel - Guide
- Ghost script - Télécharger - Polices de caractères
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
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" :
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 :
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 :
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 ;-))
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 >> $dbfileVoilà 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 ;-))
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) ...
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
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" :
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...
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 >> $dbfileelif [ $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 $2Voilà. 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;-))
Comme si ces personnes ne font pas comme leur copains profs (ils se reconnaitront ) ont fait avant eux...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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 ;-))
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 ;-))
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
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
}
$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
}
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
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.
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.