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

Shell et commandes GNU Discussion :

Script shell exercice


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Points : 0
    Points
    0
    Par défaut Script shell exercice
    Bonjour,

    J'ai un exercice de script shell à faire mais je n'y arrive pas. Pouvez-vous me donner des pistes pour que je puisse le commencer s'il vous plait
    Merci

    Voici le sujet:

    Rédiger un script shell référencé images qui admet en argument un nombre quelconque de
    répertoires et qui affiche l'espace disque total occupé, dans chaque répertoire, par les
    fichiers de type image au format « point jpg ».
    L'espace disque total, occupé par toutes les images de tous les répertoires traités, est
    également affiché (dans l'exemple ci-dessus, 41 020 + 1 008 = 42 028).
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ ./images $HOME/Images/Noel_2009 pluf $HOME/Images/Saint_Maulvis /root
    /home/raoul/Images/Noel_2009 contient 41020 ko d'images jpg
    pluf : inexistant ou non répertoire
    /home/raoul/Images/Saint_Maulvis/ contient 1008 ko d'images jpg
    /root : lecture non autorisée
    -- Total : 42028 ko
    $
    On n'oubliera d'opérer toutes les vérifications adéquates et de programmer selon l'esprit
    Unix.
    Le format d'affichage de l'exemple cidessus devra être respecté.
    Indication.
    L'utilisation de la commande du peut s'avérer utile. Consulter le manuel. En effet, traiter des
    tailles de fichiers avec la commande ls est compliqué car les champs affichés par cette
    commande ne sont pas séparés par un espace, mais plusieurs, d'où des difficultés à les
    isoler avec le filtre cut.

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    sans dire que la formulation de l’énoncé est complètement évidente, il est tout de même pas trop mal détaillé, suffisamment pour qu'on comprenne le but de l'exercice sans ambiguïté

    un bon début serait donc de répondre à la question : quel est le but de l'exercice concrètement, qu'est-ce qu'il faut faire ? (reformulation)

    l'exemple est parlant lui aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ ./images $HOME/Images/Noel_2009 pluf $HOME/Images/Saint_Maulvis /root
    en plus des directives de l'exercice, on sait donc que le script doit s’appeler images et être invocable directement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pluf : inexistant ou non répertoire
    /root : lecture non autorisée
    on sait également que les erreurs sont traitées, et on sait comment on doit les afficher s'il y en a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /home/raoul/Images/Noel_2009 contient 41020 ko d'images jpg
    /home/raoul/Images/Saint_Maulvis/ contient 1008 ko d'images jpg
    et quand il n'y a pas d'erreur, on sait également comment on doit afficher les résultats

    reste à décortiquer le processus, se représenter le bon algorithme, la structure générale du code
    • le script vient d'être lancé, le but est de travailler sur les arguments passés en ligne de commande, est-ce qu'on sait les récupérer ?
    • assez intuitivement, on va traiter chaque paramètre/répertoire séquentiellement, les uns après les autres, ça implique donc une boucle d'une manière ou d'une autre
    • on est dans la boucle, on commence à traiter le premier répertoire... qu'est-ce qu'on en fait ?


    arrivé ici, tu dois avoir au moins un bout de code, même non-fonctionnel, sur lequel on pourra éventuellement t'aider plus

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Points : 0
    Points
    0
    Par défaut Désolé mais je ne suis pas doué
    Salut, désolé j'ai beaucoup de difficulté a faire des scripts Shell


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #! /bin/bash
     
    If  (($#==0))
    Then  écho " au moins une argument requis " 
      Exit 1 
    Fi 
     
    For home
    Do..
    If ..
    Then écho "$HOME inexistant ou non répertoire "

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    faut pas dire ça : c'est un constat d'échec improductif.
    il est préférable de dire : « je voudrais progresser »
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Points : 0
    Points
    0
    Par défaut Je veux progressé
    Oui d'accord mais Je veux progresser vraiment, j'ai juste besoin d'aide

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    je te renvoie à la réponse de BufferBob.

    j'ai l'habitude de conseiller d'observer comment on résoud le problème en le faisant "à la main", sans chercher à automatiser, puis de dessiner un arbre de décision éventuellement.

    on ne peut malheureusement pas apprendre le maniement du shell à ta place.
    on ne fera pas ton travail, mais on corrigera volontiers tes erreurs.

    lis les tutos dans les liens qui figurent dans ma signature, et la FAQ shell
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par marinette08 Voir le message
    Oui d'accord mais Je veux progresser vraiment, j'ai juste besoin d'aide
    Si tu devais faire l'exercice avec un papier, un crayon et une calculatrice, tu ferais comment ? Raconte...

    Citation Envoyé par BufferBob Voir le message
    sans dire que la formulation de l’énoncé est complètement évidente, il est tout de même pas trop mal détaillé, suffisamment pour qu'on comprenne le but de l'exercice sans ambiguïté
    Euh, y a au moins une ligne mal écrite et donc très ambigüe (nouvelle orthographe) :

    Citation Envoyé par marinette08 Voir le message
    On n'oubliera d'opérer toutes les vérifications adéquates et de programmer selon l'esprit Unix.
    Au choix :
    - On n'oubliera pas d'opérer toutes les vérifications adéquates et de programmer selon l'esprit Unix.
    - On oubliera d'opérer toutes les vérifications adéquates et de programmer selon l'esprit Unix.
    Bon, honnêtement, la deuxième option je n'y crois pas du tout, mais il est toujours bon, dans ce genre de contexte, de ne laisser aucune place à l'improvisation, à la supposition et à l'estimation.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Points : 0
    Points
    0
    Par défaut
    J'ai essayer de faire quelque chose
    Pouvez me dire si je suis dans la bonne voie ou pas et si il y a des pb me les préciser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/bash
     
    If  (( $#     ))
    Then echo "$rep n'existe pas"
    Fi
    Exit 1 
     
     
    For $rep in $(du $1/*.jpg)
    Do
      If 
    Then echo "$rep contient ... ko d'images jpg"
    Else écho " $rep: lecture non autorisé "
    Fi 
    Donne
    Exit 0

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    le B-A BA de la programmation, c'est de disposer de l'environnement adapté au langage utilisé.
    or, manifestement, tu n'utilises pas de ligne de commande (shell) pour tester tes commandes !

    ce n'est pas une bonne habitude de boucler avec for sur la sortie d'une commande.
    si tu avais testé du sur un fichier, tu saurais que sa sortie est composée de plusieurs mots (au sens de la ligne de commande).

    tu dois lire un tuto pour débutant avant d'envisager de coder quoi que ce soit !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Bonjour,

    Sous unix, contrairement à windows, il faut respecter la casse: 2 commandes avec le même nom mais l'une est en minuscule et l'autre en majuscule sont 2 commandes distinctes sous unix.

    Après, pour t'aider un minima, pour ton exercice, les commandes suivantes devrait être suffisantes (Il n'y a pas de majuscules dedans!!!):
    Les if avec test pour vérifier le nombre de paramètres et pour vérifier l'existante et l'acces à un des répertoires fournit en paramètre
    Le while avec le shift pour boucler sur les paramètres
    La boucle for avec le du + le cut pour calculer la taille (l'operation est faite si tu utilises la varx dans le for et vary comme variable qui aura le résultat à la fin de la boucle for)
    et le printf ou echo pour afficher les différents messages (dans les if, ou après la boucle for).
    Un petit détail: ne pas oublier de réinitialiser la vary à 0 avant d'entrée dans la boucle for.
    Il te faudra aussi une autre variable qui portera la somme des différents vary à chaque sortie de boucle for, pour avoir le total (tout répertoire confondu) à la fin de la boucle while
    Cordialement.

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Euh... une question bête: pour boucler sur les arguments, y a-t-il un problème à faire un for sur "$@"?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
     
    for arg in "$@"; do
        echo "'${arg}'"
    done
    Ç'a l'air assez robuste pour supporter les cas limite, comme les chaines vides, les espaces, les retours et l'absence d'arguments:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ ./test_args_2.sh "" "a b" "$(echo -e "a\nb")"
    ''
    'a b'
    'a
    b'

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Oui, c'est juste par habitude de passer par un shift que j'ai proposé le while+shift et par doute aussi sur la gestion par boucle for
    Cordialement.

  13. #13
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut

    des... doutes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ (set "" "a b" "$(echo -e "a\nb")"; for i do echo ">$i<"; done)
    ><
    >a b<
    >a
    b<
    si omis, "$@" est implicite; c'est donc la manière de boucler sur les arguments positionnels.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Et oui, les mauvaises habitudes perdurent

    Les perfs sont largement meilleures via le for au lieu du while+shift (bon, en fait c'est le shift 1 qui est lent quand on a par exemple 65000 paramètres )

    En fait, pour faire dans les bons usages si on a un nombre très important de paramètres, serait de les traiter dans une boucle for et lorsque l'on n'en a plus besoin de faire un shift du nombre de paramètres histoire de "libérer la mémoire"
    Cordialement.

Discussions similaires

  1. Exercice script shell
    Par elhanche dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 17/05/2013, 21h41
  2. deux exercices de scripts shell à résoudre
    Par sadiqmrd dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 04/06/2011, 20h25
  3. Explication script shell
    Par crasho007 dans le forum Linux
    Réponses: 2
    Dernier message: 14/06/2004, 13h54
  4. Cron + terminal + script shell
    Par nicolas.pissard dans le forum Linux
    Réponses: 3
    Dernier message: 17/03/2004, 09h24

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