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 qui prend 3 arguments


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    informatique
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Par défaut Script qui prend 3 arguments
    Bonjour la communauté
    Durant la période de confinement j'apprends le bash, je coince pour réliser ce script de l'exercice suivant...

    Exercice 1
    Écrire un script bash qui prend les 3 arguments suivants :
    • un chemin de dossier : si celui-ci n'est pas valide (n'est pas un dossier, indice : tester avec -d) écrire un message d'erreur et demander à saisir un chemin jusqu'à ce qu'il soit valide.
    • une extension de fichier : si celle-ci n'est pas correcte (ne suit pas une certaine expression régulière sachant que les extensions commencent par un caractère . suivi d'au moins une lettre ou un nombre, indice : tester avec =~) écrire un message d'erreur et demander à saisir une extension jusqu'à ce qu'elle soit valide.
    • un nombre : si celui-ci n'est pas valide (ne suit pas une certaine expression régulière, indice : tester avec =~) écrire un message d'erreur et demander à saisir un nombre jusqu'à ce qu'il soit valide.
    Ce script va compter le nombre de fichiers qui ont l'extension passée en argument (ou saisie) (indice : tester avec =~) dans le dossier passé en argument (ou saisi).
    Si le nombre de fichiers est inférieur au nombre passé en argument (ou saisi) affiche le message "Vous n'avez pas assez de fichiers d'extension "X, X étant l'extension passée en argument ou saisie.
    Si le nombre de fichiers est supérieur au nombre passé en argument (ou saisi) affiche le message "Vous avez trop de fichiers d'extension "X, X étant l'extension passée en argument ou saisie.
    Si le nombre de fichiers est égal au nombre passé en argument (ou saisi) affiche le message "Vous le bon nombre de fichiers d'extension "X, X étant l'extension passée en argument ou saisie.
    Bonus : si le nombre est correct, afficher l'ensemble des fichiers.
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    pwd
    echo 'Bonjour, vous vous trouvez dans le répertoire 'pwd' '
     
    if [ "$#" -eq 0 ]; then
        echo "Saisir le répertoire"
        read -r dossier
    else
        dossier=$dossier
    fi
     
    cd $dossier
    echo "Veuillez saisir le chemin de dossier à analyser" #echo au fonctionnement similaire au précédent
    read dossier #lecture du dossier
    dossier=( $dossier ) # il s'agit de la valeur entrée par le user qui sera stockée dans $dossier
     
    nbFichier=0 #initialisation auto à valeur 0 pour que le script puisse compter les fichiers
    nbDossier=0 #initialisation auto à valeur 0 pour que le script puisse compter des dossiers
    nbExe=0 #initialisation auto à valeur 0 pour que le script puisse compter les executables
     
    for d in ${dossier[@]} #boucle en place qui va s'appliquee pour chaque dossiers présents dans le répertoire sélectionner
    do
        if [ ! -d "$d" ] #condition, si le user entre une valeur inconnue (nom de dossier inconnu)
        then
            echo 'Erreur, le dossier '$d' n existe pas' #le user sera prévenu que le dossier n'existe pas!
            continue
        fi
        cd $d
        for file in * #pour chaque fichier(s) présent(s) dans l'intégralité du répertoire sélectionné
        do #nouvelle tâche à effectuée si condition précédente remplie
            if [ -d "$file" ]
            then
                nbDossier=$((nbDossier+1))
            fi
            if [ -f "$file" ]
            then
                nbFichier=$((nbFichier+1))
            fi
            if [ -x "$file" ]
            then
                nbExe=$((nbExe+1))
            fi
        done
    done
    echo 'Nb fichier : '$nbFichier
    echo 'Nb sous-dossier: '$nbDossier
    echo 'Nb executable : '$nbExe

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Je te propose d'y aller petit à petit et de commencer par l'exercice suivant:

    Exercice 1
    Écrire un script bash qui prend 1 argument :
    • un chemin de dossier : si celui-ci n'est pas valide (n'est pas un dossier, indice : tester avec -d) écrire un message d'erreur et demander à saisir un chemin jusqu'à ce qu'il soit valide.

    Puis tu peux nous poster ton code et, le cas échéant, on t'indiquera si ça peut être amélioré.

  3. #3
    Membre du Club
    Homme Profil pro
    informatique
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Par défaut déplacement du code dans le premier message
    re,

    ah c'est super sympa les gars merci d'avance!! rien que le fait de vous intéressé a mon soucis, ca me fait super plaisir

  4. #4
    Membre du Club
    Homme Profil pro
    informatique
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Pour qu'on puisse t'aider, il faut que tu copies le code et non que tu fasses une copie d'écran (oops! grillé par N_BaH).

    Je te propose d'y aller petit à petit et de commencer par l'exercice suivant:

    Exercice 1
    Écrire un script bash qui prend 1 argument :
    • un chemin de dossier : si celui-ci n'est pas valide (n'est pas un dossier, indice : tester avec -d) écrire un message d'erreur et demander à saisir un chemin jusqu'à ce qu'il soit valide.

    Puis tu peux nous poster ton code et, le cas échéant, on t'indiquera si ça peut être amélioré.
    j'ai pensé à instaurer une boucle avec if, genre "si le chemin est valide", ca skip a la suite, sinon avec else "veuillez entrer le bon chemin"

    c'est vraiment le fait de restrancrire mes idées qui me pose problemes...

    (j'avais mal édité mon code sur le chat, sorry)

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 354
    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 354
    Par défaut
    Citation Envoyé par Gowan974 Voir le message
    j'ai pensé à instaurer une boucle avec if, genre "si le chemin est valide", ca skip a la suite, sinon avec else "veuillez entrer le bon chemin"
    Le if ne fait pas de boucle, on fait des boucle avec while/until et cela fonctionne à peu près de la même façon que le if sans le else.
    Par exemple, si je ne prends que l'exercice simple de jack-ft, décomposons le problème:
    -script prends un argument => ici, je récupère le premier argument:
    Ensuite, cet argument doit être un répertoire valide ou j'envoie une erreur et je demande à l'utilisateur un nom de répertoire jusqu'à ce que celui-ci soit valide.

    Donc techniquement, ici, pas besoin de controler si l'argument 1 existe, car implicitement, si celui-ci n'existe pas, cela ne sera pas un répertoire valide.

    Et donc, on a juste un boucle à faire tant que l'argument 1 (ici, on parlera de la variable arg1, puisque je lui ai assigné la valeur de $1 ) n'est pas un répertoire, on envoie une erreur et on demande un nouveau chemin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    until [ -d "$arg1" ]
    do
      echo "ERREUR" >&2
      echo -n "Chemin: "
      read arg1
    done
    Contrairement à while, until boucle tant que la commande (ici le test) est faux. si on avait du l'écrire avec while, il aurait fallu vérifier que arg1 ne soit pas un répertoire, donc comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while [ ! -d "$arg1" ]
    do
      echo "ERREUR" >&2
      echo -n "Chemin: "
      read arg1
    done
    A toi de voir pour la suite...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    Par défaut
    il n'est pas indiqué que les arguments ont une place définie.
    présumons donc qu'ils ont une : nomScript dossier extension nombre.
    un chemin de dossier : si celui-ci n'est pas valide (n'est pas un dossier, indice : tester avec -d) écrire un message d'erreur et demander à saisir un chemin jusqu'à ce qu'il soit valide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dossier=$1
    until test -d "$dossier"
    do
        read -r -p 'entrez un dossier valide : ' dossier
    done
    une extension de fichier : si celle-ci n'est pas correcte (ne suit pas une certaine expression régulière sachant que les extensions commencent par un caractère . suivi d'au moins une lettre ou un nombre, indice : tester avec =~) écrire un message d'erreur et demander à saisir une extension jusqu'à ce qu'elle soit valide.
    pareil : until, mais avec [[ et =~ est une regex (cf. man 7 regex).
    un nombre : si celui-ci n'est pas valide (ne suit pas une certaine expression régulière, indice : tester avec =~) écrire un message d'erreur et demander à saisir un nombre jusqu'à ce qu'il soit valide.
    pareil, avec une regex qui permet d'identifier un nombre.

    enfin, pour compter le nombre de fichiers, j'utilise un tableau dans lequel je mets un Développement des chemins (cf. man bash l'expression en italique)
    mais on peut simplement itérer sur ce Développement des chemins, en incrémentant une variable...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre du Club
    Homme Profil pro
    informatique
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Par défaut
    si j'ai bien suivi, est ce que si je pars dans ce raisonnement, j'aurai tout mon excercice?

    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
    cheminDossier=arg#1
    extension=arg#2
    nombre=arg#3
     
    tant que cheminDossier n'est pas un chemin vers un dossier
        demander cheminDossier
    finTantQue
     
    tantQue extension n'est pas regex_extension
        demander extension
    finTantQue
     
    tantQue nombre n'est pas regex_nombre
        demander nombre
    finTantQue

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    Par défaut
    je préfère until, que je trouve sous-employé.
    et ici, plutôt que de tester la négation d'une condition, ça teste sa vérification.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 135
    Par défaut
    Déjà, à première lecture, ce code fait des opérations qui ne sont pas demandées dans l'exercice mais ne fait pas celles qui ne sont pas demandées.
    Ensuite, où rencontres-tu exactement un problème ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

Discussions similaires

  1. [2008R2] script qui prend beaucoup de temps
    Par my_diva dans le forum Développement
    Réponses: 7
    Dernier message: 20/01/2014, 17h48
  2. [AC-2010] Fonction dans un module qui prend en argument un formulaire
    Par kawaya dans le forum VBA Access
    Réponses: 2
    Dernier message: 19/07/2013, 13h22
  3. [Débutant] AddHandler avec Handler qui prend ses arguments lors d'une boucle
    Par Pulcrix dans le forum VB.NET
    Réponses: 8
    Dernier message: 12/09/2012, 16h31
  4. Réponses: 4
    Dernier message: 11/04/2008, 11h36
  5. Création d'une fonction qui prend en argument une liste de cellule
    Par Dereck07 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/12/2007, 20h49

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