IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

[sh] Débutant : affichage condition if


Sujet :

Linux

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Points : 86
    Points
    86
    Par défaut [sh] Débutant : affichage condition if
    Bonjour,

    Je débute en script, soyez indulgents svp
    Je veux dans une arborescence trouver les fichiers *.sh et afficher la première ligne si elle contient #! préfixée du nom du fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    echo SCRIPTS SH AVEC GREP 1**********************
    for i in `find . -name '*.sh' 2>/dev/null`
    do
    	if head -n 1 $i | grep '#!' ;
    	then 
    		echo "$i : \c" ; head -n 1 $i;
    	fi
    done
    Le résultat obtenu est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SCRIPTS SH AVEC GREP 1**********************
    #!/bin/sh
    ./analyse_liens_tables.sh : #!/bin/sh
    #!/bin/sh
    ./comptage_occur_base.sh : #!/bin/sh
    #!/bin/sh
    ./description_tables.sh : #!/bin/sh
    #!/bin/sh
    ./script.sh : #!/bin/sh
    #!/bin/sh
    ./recherche_scripts_tous.sh : #!/bin/sh
    #!/bin/sh
    ./toto1/script.sh : #!/bin/sh
    Le test fonctionne bien, l'affichage concaténé aussi mais je n'arrive pas à enlever les lignes #!/bin/sh.
    J'ai essayé en utilisant la commande test ou les [] mais cela me déclenche une erreur de grep à chaque fichier.

    Auriez vous une solution à me proposer svp ?
    Merci d'avance pour les réponses.

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Points : 86
    Points
    86
    Par défaut
    On n'est jamais mieux servi que par soi-même
    J'ai mis le dev/null dans le test.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    echo SCRIPTS SH AVEC GREP 1**********************
    for i in `find . -name '*.sh' 2>/dev/null`
    do
    	if head -n 1 $i | grep '#!'>/dev/null; 
    	then 
    		echo "$i : \c" ; head -n 1 $i;
    	fi
    done
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SCRIPTS SH AVEC GREP 1**********************
    ./analyse_liens_tables.sh : #!/bin/sh
    ./comptage_occur_base.sh : #!/bin/sh
    ./description_tables.sh : #!/bin/sh
    ./script.sh : #!/bin/sh
    ./recherche_scripts_tous.sh : #!/bin/sh
    ./toto1/script.sh : #!/bin/sh
    Si vous avez d'autres solutions plus efficaces, n'hésitez pas

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 731
    Points : 31 054
    Points
    31 054
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par korian Voir le message
    On n'est jamais mieux servi que par soi-même
    J'ai mis le dev/null dans le test.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    echo SCRIPTS SH AVEC GREP 1**********************
    for i in `find . -name '*.sh' 2>/dev/null`
    do
    	if head -n 1 $i | grep '#!'>/dev/null; 
    	then 
    		echo "$i : \c" ; head -n 1 $i;
    	fi
    done
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SCRIPTS SH AVEC GREP 1**********************
    ./analyse_liens_tables.sh : #!/bin/sh
    ./comptage_occur_base.sh : #!/bin/sh
    ./description_tables.sh : #!/bin/sh
    ./script.sh : #!/bin/sh
    ./recherche_scripts_tous.sh : #!/bin/sh
    ./toto1/script.sh : #!/bin/sh
    Si vous avez d'autres solutions plus efficaces, n'hésitez pas
    T'as compris tout seul. En effet, tu récupérais à l'écran le résultat du grep. Et donc pour virer cet affichage parasite, suffit de le rediriger vers le périphérique poubelle qui est fait pour ça.

    Toutefois, ton script possède 2 petits défauts
    1) tu appelles 2 fois head -n1. Bon, cette commande n'est pas très lourde donc c'est pas catastrophique mais s'il s'agissait d'un truc plus gros, ce serait dommage
    Solution: mémoriser le head -n1 dans une variable que tu pourras réutiliser. De plus, tu peux demander au grep de ne chercher ta chaine que dans le début de la ligne en utilisant le chapeau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a=`head -n1 $i`
    echo "$a" | grep '^#!'>/dev/null; &&  echo "$i : $a"
    2) le for i in `liste de fichiers donnés par find` est évidemment une solution de base qu'on trouve rapidement quand on comprend comment fonctionnent les backquottes et le for mais cela possède l'inconvénient majeur que si un fichier possède un espace dans son nom, le for génèrera pour ce fichier 2 itérations, une sur le début du nom et une sur la fin et aucune des 2 ne fonctionnera.
    Solution alternative: utiliser le read (qui se cale sur le <return> et non sur l'espace) en lui donnant à manger la liste de fichiers issue du find. Ce qui donne au final
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    find . -name '*.sh' -print 2>/dev/null |while read i
    do
    	a=`head -n1 $i`
    	echo $a | grep '^#!'>/dev/null; &&  echo "$i : $a"
    done

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Affichage d'un video avi sur le web
    Par oumani dans le forum Balisage (X)HTML et validation W3C
    Réponses: 11
    Dernier message: 06/02/2006, 13h47
  2. [Débutant] affichage opengl dans un TPanel
    Par minnit_s dans le forum OpenGL
    Réponses: 1
    Dernier message: 01/01/2006, 23h03
  3. [Débutant] Affichage d'une grille
    Par Mathieu.J dans le forum OpenGL
    Réponses: 25
    Dernier message: 13/06/2004, 19h38
  4. [QuickReport][Débutant] Affichage d'un graphique
    Par poufouille dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/03/2004, 09h03
  5. [Débutant] Affichage impossible en local
    Par Alberto dans le forum ASP
    Réponses: 2
    Dernier message: 29/11/2003, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo