Shell, script CGI

Fermé
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011 - 12 mai 2011 à 09:00
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 13 mai 2011 à 10:24
Bonjour,

Je dois ecrire un script pour trouver les annonces qui contiennent le mot clé et les afficher. Sachant que chaque utilisateur a un repertoire à son nom qui contient un repertoire par annonce déposée qui lui contient trois fichiers (titre, descrption et prix). Par contre, le script ne fonctionne pas. Comment je pourrais faire pour bien voir tous les repertoires contenues dans Donnees et à chaque fois rentrer dans le répertoire pour voir ceux qui sont à l'interieur ? Quand je fais for i in Donnees, le script fait bien les instructions pour tous les fichiers dans Donnees ? Ma variable $REP_DONNEES est égale au chemin absolument du répértoire Donnees dans lequel sont crées les répertoires des utilisateurs.

#! /bin/bash
# rechercher.sh

	echo '<html>'
	echo '<body>'
	echo '<p style="text-align: center"><b>'"Liste des annonces séléctionnées "'</b></p>'
	echo '<p style="text-align: center"><b>'"$MotClef"'</b></p>'
	
	for i in "$REP_DONNEES"
	do
		if [ "$REP_DONNEES/$i" != "$REP_DONNEES/$NOM" ]
		then
			for j in "$REP_DONNEES/$i/$j"
			do
				
			for k in  'grep "$MotClef" $REP_DONNEES/$i/$j/titre'
			do
	
					echo '<form action="http://localhost/cgi-bin/aiguilleur.cgi" method="get">'
					echo '<input type="radio" name="radio" value="'$Titre'" />'
					echo '<p style="text-align: left">'"'$Description'"'</p>'
					echo '<p style="text-align: left">'"'$Prix'"'</p></ hr>'
				
			done
					
			for k in  'grep "$MotClef" $REP_DONNEES/$i/$j/desc'
			do
				echo '<form action="http://localhost/cgi-bin/aiguilleur.cgi" method="get">'
				echo '<input type="radio" name="radio" value="'$Titre'" />'
				echo '<p style="text-align: left">'"'$Description'"'</p>'
				echo '<p style="text-align: left">'"'$Prix'"'</p></ hr>'
			
			done
			done
		fi
	done

	echo '<form action="http://localhost/cgi-bin/aiguilleur.cgi" method="get">'
	echo '<center>'
	echo '<input type="submit" name="ACTION" value="Acheter" />'
	echo '<input type="submit" name="ACTION" value="RetourActions" />'
	echo '</center>'
	echo '</form></body></html>'


Merci d'avance,>
A voir également:

20 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
12 mai 2011 à 09:25
Salut,

Déjà dans ton script la variable "$REP_DONNEES" n'est déclarée nulle part ;-((

Ensuite il nous faudrait une vue concrète de l'arborescence de ton dossier (si tu as la commande "tree" d'installer ce serait parfait), afin de mieux cerner la demande et d'adapter au plus juste...
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
12 mai 2011 à 09:44
La variable $REP_DONNEES est déclarée dans un autre script et exportée. Normalement il n'y a pas de problemes avec elle puisque je l'utilise pour d'autre script et ça marche. En fait j'essaye de créer un serveur de vente entre particulier. Donc au début, quelqu'un s'inscrit. Un repertoire avec pour nom son identifiant est alors crée dans Donnees. Ensuite, s'il sépose une annonce, un repertoire est crée dans le sien, avec pour nom annonce$numAnnonce ($numAnnonce etant un numéro qui augmente d'un à chaque fois). Et dans le répertoire annonce1 par exemple, trois fichier sont creer : titre comprenant le titre de l'annonce, desc comprenant sa description, et prix comprenant son prix.

Au final, dans Donnees, je peux avoir un truc comme ça :

usr1 -> annonce3 -> desc prix titre
usr 2 -> annonce 1 -> desc prix titre
-> annonce 2 -> desc prix titre
usr3 ->

L'utilisateur 2 a posté les 2 première annonces, l'utilisateur 1 la troisieme et l'utilisateur 3 n'en a pas posé. Ce que j'essaye d'écrire, c'est le script rechercherAnnonces. Un utilisateur rentre un mot clé, et le script renvoie toutes les annonces contenant ce mot, sachant qu'il ne faut pas regarder dans le repertoire de l'utilisateur qui fait la recherche.

J'ai fait quelque test, et enfait si je demande d'afficher $i avant le premier if, il m'affiche $REP_DONNEES, dans le for i in "$REP_DONNEES" n'a pas l'air de fonctionner.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
12 mai 2011 à 10:07
Si je comprends bien, le but est de rechercher si une annonce contenant le mot clé existe déjà dans l'arborescence en dehors de celle de l'utilisateur, c'est ça ?

Si je comprends toujours bien, normalement la recherche doit être faite que sur le fichier "desc" (description) ? ou sur le titre aussi ?
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
12 mai 2011 à 10:08
Oui, c'est ça.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
12 mai 2011 à 10:37
Bon normalement avec un simple "grep -r" ou en utilisant "find" ça devrait suffire...

Voici un exemple pour illustrer mes dires. Je cherche le motif "mp3" et j'exclue de la recherche le répertoire de l'utilisateur "titi". Le motif "mp3" est présent dans le fichier "desc" de toto et titi.

$ tree
.
|-- titi
|   '-- annonce3
|       |-- desc
|       |-- prix
|       '-- titre
|-- toto
|   |-- annonce1
|   |   |-- desc
|   |   |-- prix
|   |   '-- titre
|   '-- annonce2
|       |-- desc
|       |-- prix
|       '-- titre
'-- tutu

6 directories, 9 files

$ find . \( -name 'titi' -prune \) -o \( -name "desc" -type f \) -exec grep -H 'mp3' {} \;
./toto/annonce2/desc:mp3

$ grep -rH 'mp3' * | grep -v 'titi'
toto/annonce2/desc:mp3

$

;-))
0

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

Posez votre question
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
12 mai 2011 à 10:40
Merci ^^

Par contre, je ne connais pas trop la commande find. Que signifie -prune ? et - exec ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
12 mai 2011 à 10:46
Avec l'option '-prune' on exclue le nom sus-cité dans l'expression entre parenthèse de la recherche, donc à toi d'y mettre le nom de l'utilisateur adéquat.

La commande "-exec" demande à find d'exécuter la commande donnée en paramètre (ici grep), commande à laquelle on passe les arguments trouvés par find via les "{}".

man find pour plus de détails ;-)
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
12 mai 2011 à 10:47
Et l'option -rH de grep sert à quoi ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
12 mai 2011 à 10:47
man grep ;-\
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
12 mai 2011 à 10:57
Mais il faut que je récupère aussi le titre, la description et le prix pour pouvoir les afficher. La commande grep, elle va me retourner le chemin absolu c'est ça ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
12 mai 2011 à 11:06
Oui ;-)
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
12 mai 2011 à 11:10
J'ai affecté la sortie de la commande grep à une variable TROUVE. Pour pouvoir récupérer le titre, description et prix, j'aimerais remonter au père annonce qui contient les 3 fichiers, mais je n'y arrive pas. J'ai essayé avec cd ../$TROUVE mais ça me dit cd ../NOM/annonce1/titre:mp3 : No such file or directory.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
12 mai 2011 à 11:33
../NOM/annonce1/titre:mp3 :
C'est à cause du motif recherché qui est présent dans le retour de la commande ;-(

Essaye avec "grep -rl" au lieu de "grep -rH".

$ grep -rH 'mp3' * | grep -v 'titi'
toto/annonce2/desc:mp3

$ grep -rl 'mp3' * | grep -v 'titi'
toto/annonce2/desc
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
12 mai 2011 à 11:40
ça me donne le bon truc mais cd ../ ne donne toujours pas le répertoire père donc je ne peux pas accéder aux valeurs.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
12 mai 2011 à 11:44
Il ne te donne pas le répertoire père pour la bonne raison que tu n'es pas dans le répertoire fils mais dans le répertoire d'où tu as lancé la commande ;-\
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
12 mai 2011 à 11:47
Mais comment faire pour accéder au répertoire fils, si la commande cd ne marche pas ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
12 mai 2011 à 11:58
$ pwd # Répertoire courant
/home/jp/tmpfs/rep

$ A=$(grep -rl 'mp3' * | grep -v 'titi') # On définit la variable

$ echo ${A} # La variable contient le nom du le fichier en trop
toto/annonce2/desc

$ echo ${A%/*} # Avec l'expansion des paramètres on s'en débarrase
toto/annonce2

$ echo ${PWD} # La variable d'environnement contient le rep courant
/home/jp/tmpfs/rep

$ cd ${PWD}/${A%/*} # y'a plus qu'à...

$ pwd # On est bien au bon endroit
/home/jp/tmpfs/rep/toto/annonce2

$

;-))
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
12 mai 2011 à 12:23
Merci, mais je n'ai jamais vu ça en cours donc je ne pense pas qu'il faille faire comme ça. Je vais essayer avec les commandes grep, find et sed.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
Modifié par zipe31 le 12/05/2011 à 12:34
Et la commande dirname tu l'a vu ?
0
MiladyThethys Messages postés 125 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 3 janvier 2013 20
12 mai 2011 à 14:43
Salut,

Tu veux une récursivité sur les répertoires de ton répertoire principal ?
Il faut que tu testes si c'est un répertoire
 if [ -d $ma_variable ]
then
     ./monScript $repertoirecourant/$ma_variable
fi


SInon, j'ai pas compris ta question...
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
12 mai 2011 à 23:28
Non, je n'ai pas vu la commande dirname non plus. Mais j'ai vu grep et sed.
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
13 mai 2011 à 08:33
En fait, j'aimerais pouvoir accéder au repertoire père du chemin que le grep me donne. Si il me donne /usr/annonce/titre, il faudrait que je puisse retourner à annonce pour trouver /usr/annonce/prix et /usr/annonce/desc
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
13 mai 2011 à 08:41
Ce que je ne comprends pas c'est que si je fais cd $variable du grp, ça me met Not a directory. On peut pas faire de cd si c'est un fihcier ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
13 mai 2011 à 08:47
D'où mon exemple plus haut et la demande pour "dirname" qui est une commande du shell :

$ A=/usr/annonce/titre

$ echo ${A%/*}
/usr/annonce

$ dirname $A
/usr/annonce
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
13 mai 2011 à 08:53
D'accord, merci, je vais chercher un peu comment marche cette commande.
Sinon, imaginons qu'il y ait plusieurs annonce qui est le mot clef, la commande grep renvoie les chemins séparés d'un espace. Comment je peux les traiter un par un ? J'ai essayé avec un for i in $variable grep mais ça ne marche pas.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
13 mai 2011 à 09:21
Comment lire un fichier ligne par ligne

C'est pareil avec un flux en entrée.
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
13 mai 2011 à 09:21
C'est bon, je crois avoir reussi.

Merci pour toute l'aide !!!!
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
13 mai 2011 à 10:02
J'ai un nouveau probleme. Je dois ecrire un formulaire avec des boutons radio pour que l'acheteur puisse selectionner l'annonce qu'il veut acheter. Dans mon énoncé, on dit d'affecter 2 valeurs (NOM_VENDEUR et ANNONCE) au même bouton radio en les séparant par un espace.

J'ai donc fait <input type="radio" name="radio" value="'$NOM_VENDEUR $ANNONCE'" />
mais je n'arrive pas à les récupérer dans mon script après.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
13 mai 2011 à 10:09
Euh... ce n'est pas la faute aux quotes simples autour de tes variables ???
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
13 mai 2011 à 10:22
Non, ça ne fonctionne pas sans non plus. Et je ne comprends, normalement un seul bouton radio ne peut être coché à la fois, non ? Mois je peux en cocher deux et je ne peux pas les décocher
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
13 mai 2011 à 10:24
Euh... là par contre on sort de mon domaine de compétences, désolé ;-\
0
nidjounette Messages postés 18 Date d'inscription dimanche 8 mai 2011 Statut Membre Dernière intervention 13 mai 2011
13 mai 2011 à 10:24
Ah, j'ai compris pourquoi ça faisait ça. Mais je ne peux tuojours pas récupérer mes variables.
0