Shell, script CGI

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,>

20 réponses

Résumé de la discussion

Trouver des annonces contenant un mot clé dans une arborescence où chaque utilisateur dispose d'un répertoire et de sous-répertoires d'annonces comprenant titre, description et prix est le souci. La solution proposée suggère d'utiliser find avec -prune pour exclure certains noms, puis -exec pour lancer grep sur les fichiers titre et desc des répertoires d'annonces. D'autres échanges suggèrent d'utiliser des variantes de grep comme grep -rl ou grep -rH et d'ajuster le parcours des répertoires pour itérer correctement sur chaque annonce. En complément, des conseils portent sur la lecture ligne par ligne des fichiers et sur la récupération des valeurs transmises par des boutons radio dans le script, afin de renforcer la robustesse des contrôles.

Bobot (l’IA à votre service)
  1. Contributeur
    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
    1. 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
      1. Contributeur
        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
    2. Contributeur
      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
      1. Merci ^^

        Par contre, je ne connais pas trop la commande find. Que signifie -prune ? et - exec ?
        0
        1. Contributeur
          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
      2. Et l'option -rH de grep sert à quoi ?
        0
        1. Contributeur
          man grep ;-\
          0
      3. 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
        1. Contributeur
          Oui ;-)
          0
      4. 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
        1. Contributeur
          ../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
      5. ç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
        1. Contributeur
          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
      6. Mais comment faire pour accéder au répertoire fils, si la commande cd ne marche pas ?
        0
        1. Contributeur
          $ 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
      7. 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
        1. Contributeur
          Et la commande dirname tu l'a vu ?
          0
      8. 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
        1. Non, je n'ai pas vu la commande dirname non plus. Mais j'ai vu grep et sed.
          0
          1. 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
            1. 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
              1. Contributeur
                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
            2. 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
            3. C'est bon, je crois avoir reussi.

              Merci pour toute l'aide !!!!
              0
              1. 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
                1. Contributeur
                  Euh... ce n'est pas la faute aux quotes simples autour de tes variables ???
                  0
              2. 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
                1. Contributeur
                  Euh... là par contre on sort de mon domaine de compétences, désolé ;-\
                  0
              3. Ah, j'ai compris pourquoi ça faisait ça. Mais je ne peux tuojours pas récupérer mes variables.
                0