Forum Linux.débutant Explication d'un Script Shell

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-8
4
nov.
2013

Bonjour !

On me demande pour mes cours de comprendre le but de ce script.

 for fic in *
   do  
   if [ -f $fic -a "./$fic" != $0 ]   
    then   
    grep "windows" < $fic > /dev/null   
    blacklist=$?     
    if [ $blacklist -eq 0 ]    
    then 
    mv $fic $POUBELLE   
   fi    
 fi  
 done

Etant un novice en scripting linux, je n'y comprends pas grand chose..

Merci d'avance

  • # T'en penses quoi toi ?

    Posté par  (site web personnel) . Évalué à 7.

    Si c'est pour tes cours, ne t'attends pas à trouver une réponse toute faite ici. Dis nous déjà ce que tu en comprend, ça pourrait être un bon départ…

    Par exemple : y a-t-il des variables d'environnements utilisées ? Qu'attend le script en entrée ? Qu'est ce qu'il produit en sortie etc…

  • # Le script troller

    Posté par  (site web personnel) . Évalué à -4.

    Le script cherche le mot "windows" dans tous les fichiers du répertoire courant (excepté le script lui-même), et si c'est le cas, le fichier sera déplacé dans le répertoire ciblé par la variable POUBELLE (qui n'est pas définie dans la portion que tu nous a montré).

  • # Ce que j'ai pu comprendre du script

    Posté par  . Évalué à 2.

    Merci pour vous réponses.

    Je n'attendais pas la réponse toute prête mais juste comprendre à quoi correspondent les termes que je ne comprends pas.

    Comme variable d'environnement, on a $POUBELLE
    Je n'comprends pas la première ligne : "for fic in *"

    ensuite "do" c'est "faire", cela fait partie de la boucle for

    Puis la ligne suivante, je ne la comprends pas non plus: "if [ -f $fic -a "./$fic" != $0 ]"

    Then fait parti de la boucle for

    La ligne suivante : grep "windows" < $fic > /dev/null sert à rechercher le mot windows mais en même temps rediriger le contenu dont on ne se sert pas ? Je ne comprends pas non plus..

    Les deux lignes suivantes avec "Blacklist" restent obscures pour moi aussi.

    Enfin :
    then toujours dans la boucle
    mv $fic $POUBELLE sert à le déplacer dans la poubelle

    Puis FIN.

  • # RTFM ?

    Posté par  (site web personnel) . Évalué à 2.

    Il n'y a pas de secret, il faut lire et pratiquer… Par exemple, tu peux lire ce livre, consulter ce site et aussi celui-ci.

    Les logiciels de traitement de texte sont à la rédaction ce que la 2CV est à l'automobile, une vieille voiture dont on se souvient avec nostalgie mais technologiquement dépassée

  • # lire ton cours

    Posté par  . Évalué à -1.

    ben oui, logiquement dans ton cours il doit y avoir les definitions de

    • for ... do ... done
    • if ... then ... fi

    et dans le pire des cas, en ligne de commande, ca doit pouvoir te renseigner :

    man for

    man if

    • [^] # Re: lire ton cours

      Posté par  . Évalué à 3.

      info bash plutôt s'il est sous linux, chez moi j'ai les man pages des commandes "if, for…" que pour le tcl ;)

      • [^] # Re: lire ton cours

        Posté par  (site web personnel) . Évalué à 2.

        S’il veut juste une référence rapide, il peut aussi utiliser help for, help if, etc, plutôt que de consulter la page d’info complète.

    • [^] # Re: lire ton cours

      Posté par  . Évalué à 3.

      euh faut pas pousser quand même, "man for" et "man if" ça ne marche pas.
      En revanche "man bash"…

      • [^] # Re: lire ton cours

        Posté par  (site web personnel) . Évalué à 3.

        En revanche "man bash"

        te renvoie une page imbitable dans laquelle on passe des heures à trouver ce qu'on cherche ! Dire à quelqu'un d'aller chercher l'info là dedans, c'est le décourager dès le début et entretenir le cliché d'un terminal abscons et complètement hermétique.

        Mieux vaut aller sur le manuel de référence déjà cité plus haut.

  • # Quelle formation ?

    Posté par  . Évalué à 2.

    Juste par curiosité, dans quelle formation et en quelle année on te demande ce genre d'exercices ?

  • # Merci encore pour vos réponses

    Posté par  . Évalué à 2.

    Je suis actuellement en première année à Epitech

    Je vais lire les sources que vous m'avez indiqué. Merci

    • [^] # Re: Merci encore pour vos réponses

      Posté par  . Évalué à 6.

      Question subsidiaire : que se passe-t-il si tu retires " -a "./$fic" != $0 " du test ?

      ça me rappelle quand j’étais étudiant, on avait comme exercice en shell de faire un parcours récursif des répertoires en affichant les fichiers au passage.
      Pour faire joli j'avais voulu rajouter "--->" devant le nom du fichier, et donc " echo ---> $file "…

  • # mais mais mais

    Posté par  . Évalué à 2. Dernière modification le 04 novembre 2013 à 19:53.

    faut pendre le prof qui a pondu ce script (nan j'déconne ;) ça permet de décomposer le code

    - grep "windows" < $fic > /dev/null   
    + grep -sq "windows" "$fic"

    ensuite je ferai plutôt du

    if grep -sq "windows" "$fic"
    then
    ...
    fi

    et enfin je me poserai la question de faire

    mv $(\grep -le "w[i]ndows" * ) $POUBELLE

    ou encore

    mv $(\grep windows * | grep -ve "$0" ) $POUBELLE

    ou pour prendre en compte le cas où aucun fichier ne corresponds

    PLOP=$( \grep -l windows * | grep -ve "^$(basename $0)\$" )
    test -n "$PLOP" && mv $PLOP $POUBELLE

    on pourrait aussi faire du

    grep -l windows | grep -ve "^$0\$" | while read file
    do
     mv $file $POUBELLE
    done

    Bon je vais m'arrêter là. On peut avoir plein de variation comme mettre le test dans le while plutôt qu'une exclusion par grep ;)

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

    • [^] # Re: mais mais mais

      Posté par  (site web personnel) . Évalué à 3.

      J'ai corrigé la mise en forme de ton commentaire pour qu'il soit lisible et colorié.

      • [^] # Re: mais mais mais

        Posté par  . Évalué à 2.

        Merci ;)

        Il ne faut pas décorner les boeufs avant d'avoir semé le vent

    • [^] # Re: mais mais mais

      Posté par  . Évalué à 1.

      sauf que le but de l'execise n'est surement pas d'optimiser mais de decouper le probleme en plusieurs morceaux facilement identifiables/modifiables

      • [^] # Re: mais mais mais

        Posté par  . Évalué à 1.

        oui mais je trouve surtout dommage de ne pas utiliser "correctement" une commande.

        grep à des options, il faut les enseigner. Surtout les options POSIX, sinon on prend de moins bonnes ou carrément mauvaises habitudes.

  • # Merci

    Posté par  . Évalué à 0.

    Je comprends toujours pas à quoi sert fic et surtout la Blacklist, que vient elle faire dans le script ?

    • [^] # Re: Merci

      Posté par  (site web personnel) . Évalué à 3.

      Pour fic : quand tu vois ce qui suit, tu te demandes à quoi sert i ?

      for (i=0; i<max; ++i) {
        // ...
      }

      Pour blacklist, la variable peut être supprimée :

       grep "windows" < $fic > /dev/null   
          if [ $? -eq 0 ]

      Du coup la question est que veut dire $? en bash, et ensuite quand est-ce que grep renvoie 0 ?

    • [^] # Re: Merci

      Posté par  . Évalué à 4.

      Je comprends toujours pas à quoi sert fic et surtout la Blacklist, que vient elle faire dans le script ?

      Que la prochaine fois tu iras en cours ?
      Que la prochaine fois tu liras les manuels ?
      $ man bash
      $ man grep

      ou plus simple ask/bing/ddg/google/qwant -> tutorial bash

      fic est une variable, ici utilisé comme itérateur de boucle, blacklist est aussi une variable qui prends la valeur de $?, la variable $? est une variable automatique de bash dont tu pourra trouver la signification dans le manuel

      Il ne faut pas décorner les boeufs avant d'avoir semé le vent

      • [^] # Re: Merci

        Posté par  . Évalué à 2.

        Je comprends toujours pas à quoi sert fic et surtout la Blacklist, que vient elle faire dans le script ?

        Que la prochaine fois tu iras en cours ?
        Que la prochaine fois tu liras les manuels ?

        Je te trouve un peu dur là. Quand j'ai commencé à programmer en shell, je me rappelel avoir eu du mal avec les variables de boucle, et le prof était allé un peu vite sur ces "détails" qui peuvent paraître évidents pour un habitué mais pas forcément pour un novice. Le shell est un langage étrange au début pour toute personne habitué au C/C++ par exemple.

        De plus il arrive parfois que des profs donnent des choses à faire et à comprendre sans forcément donner tous les éléments nécessaires dans le cours, sans compter sur le fait que certains cours sont mal faits. Donc certes, je suis d'accord avec ceux qui donnent des pistes, sans donner la réponse toute cuite, mais là je trouve que tu y vas un peu fort.

        Pour le posteur initial : peux-tu nous extraire la partie de ton cours qui traite des boucles for et nous indiquer pourquoi tu ne la comprends pas ?

        • [^] # Re: Merci

          Posté par  . Évalué à 2.

          à ton époque, probablement pré 2002, le réflexe des moteurs de recherche était probablement moins prononcé, et leurs résultat moins bon, aujourd'hui quand tu tapes shell for dans google tu tombes sur http://www.linux-france.org/article/dalox/unix04.htm en deuxième position.

          Il ne faut pas décorner les boeufs avant d'avoir semé le vent

          • [^] # Re: Merci

            Posté par  . Évalué à 2.

            Je l'ai fait avant de répondre, et pour quelqu'un qui n'y connait rien en shell, c'est difficile de faire le tri entre les bons tutoriels et les mauvais. De plus, il est parfois difficile de chercher avec les bon mots clé pour avoir rapidement le bon site.
            Le problème aujourd'hui c'est que beaucoup de monde crée son site pour ne rien dire ou pour pas grand chose : et il m'arrive souvent, pour des sujets que je ne connais pas, de devoir épelucher une vingtaine de sites inintéressants pour pouvoir trouver un bout d'info qui m'intéresse, et de n'avoir l'info pertinente qu'au bout de quelques heures de recherche et d'affinement d'expression à donner à Google.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.