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 :

[Exercices] Liste d'exercices corrigés en shell script et bash


Sujet :

Shell et commandes GNU

  1. #21
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    Citation Envoyé par Sve@r Voir le message
    Les bons tutos de shell ont tous un chapitre sur la façon de neutraliser les métacaractères
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    script.sh 10 \* 10
    script.sh 10 '*' 10
    script.sh 10 "*" 10
    Ici par exemple
    => http://frederic-lang.developpez.com/...l/?page=page_7

    Bon oui cet article ne fait que donner des énoncés et des solutions en provenance de différents membres, il a pour vocation à aider les débutants à s'entrainer mais pas à remplacer un cours qui donne les bases dont le débutant est censé avoir acquis avant de se lancer dans la pratique de ces exercices. Des cours qui donnent des bases plus que suffisantes, nous en fournissons également (et les liens sont indiqués dans cette même liste d'exercices).

    Cette liste n'a pas non plus pour vocation à donner des solutions toutes faites que le débutant se contente de copier/coller sans réfléchir, le débutant doit réfléchir à sa propre solution en lisant l'énoncé (avant de regarder les corrections) et doit se heurter à ces problèmes comme l’expansion de la wildcard (qui comme le souligne Sve@r n'est pas du à l'implémentation de la solution mais au shell par lequel il l'exécute), sachant que des explications sont fournies dans d'autres cours et que des forums sont aussi là pour répondre aux questions dont on ne trouve pas la réponse.

    Idriss

  2. #22
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 174
    Points : 113
    Points
    113
    Par défaut
    une autre solution exercice test user II-B-1
    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
    #!/bin/bash
    menu()
    {
    echo "1 - Vérifier l'existence d'un utilisateur"
    echo "2 - Connaître le UID d'un utilisateur"
    echo "3 - Quitter"
    read -r choix
    }
    verification()
    {
    read -p "le nom de l'utilisateur= " nom
    grep $nom /etc/passwd > fichtest
    if [ -s fichtest ] ;then
    echo "ce utilisateur existe"
    else
    echo "ce utilisateur n'existe pas"
    fi
    }
    uid()
    {
    read -p "le nom de l'utilisateur= " nom
    cat /etc/passwd | grep $nom > fichtest
    if [ -s fichtest ] ;then
    grep $nom /etc/passwd | cut -d : -f 3
    else
    echo "ce utilisateur n'existe pas"
    fi
    }
    repeat=1
    while [ $repeat -eq 1 ]
    do
    menu
    if [ $choix -eq 3 ];then
    echo "au revoir"
    repeat=2
    fi
    if [ $choix -ne 1 ] && [ $choix -ne 2 ] && [ $choix -ne 3 ] ;then
    echo "erreur de saisie"
    fi
    if [ $choix -eq 1 ] ;then
    verification
    fi
    if [ $choix -eq 2 ] ;then
    uid
    fi
    done

  3. #23
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par MR-SMOOT Voir le message
    une autre solution exercice test user II-B-1
    Code bash : 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
    47
    48
    49
    #!/bin/bash
    menu()
    {
        echo "1 - Vérifier l'existence d'un utilisateur"
        echo "2 - Connaître le UID d'un utilisateur"
        echo "3 - Quitter"
        read -r choix
    }
     
    verification()
    {
        read -p "le nom de l'utilisateur= " nom
        grep $nom /etc/passwd > fichtest
        if [ -s fichtest ] ;then
            echo "ce utilisateur existe"
        else
            echo "ce utilisateur n'existe pas"
        fi
    }
     
    uid()
    {
        read -p "le nom de l'utilisateur= " nom
        cat /etc/passwd | grep $nom > fichtest
        if [ -s fichtest ] ;then
            grep $nom /etc/passwd | cut -d : -f 3
        else
            echo "ce utilisateur n'existe pas"
        fi
    }
     
    repeat=1
    while [ $repeat -eq 1 ]
    do
        menu
        if [ $choix -eq 3 ];then
            echo "au revoir"
            repeat=2
        fi
        if [ $choix -ne 1 ] && [ $choix -ne 2 ] && [ $choix -ne 3 ] ;then
            echo "erreur de saisie"
        fi
        if [ $choix -eq 1 ] ;then
            verification
        fi
        if [ $choix -eq 2 ] ;then
            uid
        fi
    done
    Désolé, je ne valide pas
    1. ta fonction "menu()" remplit une variable "choix" qui sera traitée en dehors de celle-ci. Ta fonction n'est donc pas indépendante (si on modifie la variable, faut aller la rechercher partout dans le reste du code pour la modifier aussi).
    2. ton grep que tu rediriges dans un fichier juste pour vérifier qu'il a bien réussi est horrible. Tu génères une écriture disque juste pour mémoriser une info et le jour où tu lances ton script deux fois en parallèle (hé oui, Unix est multitaches donc faut considérer qu'un script peut tourner sur plusieurs instances en même temps), bonjour la collision. Et puis ensuite, quand le script se termine, tu restes avec ton fichier "fichtest" qui va te polluer tous tes répertoires (il est créé là où tu te trouves). Si au-moins tu avais ne serait-ce que pensé à créer ce fichier dans $HOME/tmp (ou au pire dans /tmp) histoire de pas faire le gros sale qui laisse ses fichiers poubelles un peu partout (et je ne parle pas que de toi mais aussi de tous les utilisateurs qui exécuteront ton script).
      Ce qui m'amène d'ailleurs à me demander ce qui se passera si tu lances le script depuis le dossier /etc (après tout, on est libre de se trouver n'importe où dans la machine non ?). Figure de réthorique car je sais très bien ce qui se passera mais c'est pour que toi tu en prennes conscience.
      De plus, moi j'ai tous mes comptes bancaires dans un fichier que j'ai appelé "fichtest" (j'ai le droit non ?). Je suis content le jour où je le perds parce que j'ai lancé ton script !!!
    3. Dans uid tu fais deux fois le même grep. C'est vrai que mémoriser le premier pour le réutiliser ensuite aurait été trop simple et surtout aurait donné un script beaucoup plus rapide...
    4. A propos de ce grep, justement, tu t'es demandé ce qui se passe si on demande l'uid de l'utilisateur "ro" ? ou "oot" ? ou "home" ? ou juste ":" ?
    5. Et enfin ta façon d'évaluer le choix du menu. Déjà tu fais 3 tests distincts pour vérifier s'il est différent de [1, 2, 3] (tu ne connais pas le connecteur "-a" signifiant "and" ? => [ $choix -ne 1 -a $choix -ne 2 -a $choix -ne 3 ]) mais que se passera-t-il si le script évolue et offre ensuite des choix 4, 5 et 6 ? Bonjour le test qu'il faudra alors écrire (tu aurais pu déjà simplifier en regardant juste choix < 1 ou choix > 3). Et sinon tu ne connais pas le case ???


    Désolé, ta solution, bien que montrant certains efforts, est tout sauf réussie car pas assez réfléchie. A la limite elle pourrait servir pour montrer ce qu'il ne faut pas faire...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #24
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 174
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    [/LIST]
    Désolé, ta solution (pondue par un admin système en plus ) est tout sauf réussie. A la limite elle pourrait servir pour montrer ce qu'il ne faut pas faire...
    (y) t'a vraiment raison merci pour t'es conseil je vais les prendre en compte
    ps: je suis juste un etudiant au 1ere annee au reseau informatique j'ai actualisé mes info et je ne suis pas un administrateur j'etudie que ccna ,windows server et un peu linux
    donc je pense que mon resultat pour un debutant n'est pas mal parce que le programme marche a la fin ^^ et merci beaucoup pour ton aide

  5. #25
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 174
    Points : 113
    Points
    113
    Par défaut
    bon voila j'ai fais ce que tu m'avais dit et voila le résultat ^^ j’espère que cette fois y'a pas trop de problème avec le script
    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
    #!/bin/bash
    verification()
    {
    read -p "le nom de l'utilisateur= " nom
    grep "^$nom:" /etc/passwd > /tmp/fichtest
    if [ -s /tmp/fichtest ] ;then
    echo "ce utilisateur existe"
    else
    echo "ce utilisateur n'existe pas"
    fi
    }
    uid()
    {
    read -p "le nom de l'utilisateur= " nom
    grepcut=`grep "^$nom:" /etc/passwd | cut -d : -f 3`
    if [ $grepcut -gt 0 ] ;then
    echo "le uid de $nom est $grepcut "
    else
    echo "ce utilisateur n'existe pas"
    fi
    }
    repeat=1
    while [ $repeat -eq 1 ]
    do
    echo "1 - Verifier l'existence d'un utilisateur"
    echo "2 - Connaitre le UID d'un utilisateur"
    echo "3 - Quitter"
    read -r choix
    if [ $choix -eq 3 ];then
    echo "au revoir"
    repeat=2
    fi
    if [ $choix -lt 1 -o $choix -gt 3 ] ;then
    echo "erreur de saisie"
    fi
    if [ $choix -eq 1 ] ;then
    verification
    fi
    if [ $choix -eq 2 ] ;then
    uid
    fi
    done

  6. #26
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par MR-SMOOT Voir le message
    j'espere que cette fois y'a pas trop de probleme avec le script
    Il y en a un peu moins... mais j'apprécie les efforts. Surtout d'avoir pensé au "^$nom:" dans le grep pour éviter les cas "ro", "oot" et etc. Mais pourquoi avoir enlevé le menu ? Ce n'est pas parce qu'il était mal fait que ce n'était pas une bonne idée...

    Bon, je ne vais pas détailler les soucis résiduels. Juste que créer un fichier (même temporaire) pour mémoriser une simple info...

    Voici ce que je te propose

    Code bash : 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
    47
    48
    #!/bin/bash
    menu()
    {
        echo "1 - Vérifier l'existence d'un utilisateur"
        echo "2 - Connaître le UID d'un utilisateur"
        echo "3 - Quitter"
        read -r choix
        return $choix
    }
     
    verification()
    {
        read -p "le nom de l'utilisateur= " nom
        if grep "^$nom:" /etc/passwd 1>/dev/null; then
            echo "l'utilisateur $nom existe"
            return 0
        else
            echo "l'utilisateur $nom n'existe pas"
            return 1
        fi
    }
     
    uid()
    {
        read -p "le nom de l'utilisateur= " nom
        info=`grep "^$nom:" /etc/passwd`
        if [ -n "$info" ] ;then
            echo "L'utlisateur $nom a comme uid `echo "$info" | cut -d: -f3`"
            return 0
        else
            echo "L'utilisateur $nom n'existe pas"
            return 1
        fi
    }
     
    while true
    do
        menu; choix=$?
        case $choix in
            1) verification;;
            2) uid;;
            3)
                echo "Au revoir"
                break
                ;;
            *) echo "erreur de saisie"
        esac
    done

    C'est pas parfait parfait (fait à la "va-vite" avec beaucoup de code redondant) mais au-moins ça n'a aucun des défauts que j'avais mentionné dans mon post précédent. Les return des fonctions verif() et uid() ne sont pas nécessaires mais j'aime bien que mes fonctions soient booléennes.

    Concernant les fichiers temporaires, déjà faut éviter si possible mais si ça ne l'est pas, c'est alors bien d'adjoindre la variable "$$" (n° pid) dans leurs noms. Ca évite le problème des collisions lors des scripts lancés plusieurs fois en parallèle...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #27
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 174
    Points : 113
    Points
    113
    Par défaut
    merci pour ces informations et désolé pour le dérangement

  8. #28
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par MR-SMOOT Voir le message
    merci pour ces informations et désolé pour le dérangement
    pourquoi ne pas utiliser getopts ou select?

    exemple de menu avec select choppé rapidement avec google.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    PS3="Enter your choice :"
    select menu_list in English francais
    do
        case $menu_list in
            English)  print "Thank you";;
            francais) print "Merci";;
            *)        print "???"; break;;
        esac
    done
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  9. #29
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    pourquoi ne pas utiliser getopts ou select?
    getopts n'a pas le même but et l'exercice demande un menu et non des options. select effectivement j'y avais pas pensé, toujours malheureusement trop cantonné à penser en sh et pas assez en bash...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #30
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    exemple de menu avec select choppé rapidement avec google.
    Et des exemples d'utilisation de getopts et getopt : http://ineumann.developpez.com/tutor...pratiques/#LIV

  11. #31
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    getopts n'a pas le même but et l'exercice demande un menu et non des options. select effectivement j'y avais pas pensé, toujours malheureusement trop cantonné à penser en sh et pas assez en bash...
    C'est vrai mais ça vaudrait peut être le coup de faire une version de l'exercice avec des options
    (Et aussi proposer une correction avec select pour l'exercice demandant un menu). Sinon pareil que toi, pas l'habitude d'utiliser select au profit d'un while true; read ...; case ...; break.

    Sve@r, je note que dans ta solution tu as pensé à l'option -r de read .

    Idriss

  12. #32
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 174
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    pourquoi ne pas utiliser getopts ou select?
    mercio mais je sais pas encore travailler avec getopts je suis encore debutant
    je veux savoir un truc comment le programme peut savoir que l'utilisateur existe avec cette commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if grep "^$nom" /etc/passwd > /dev/null; then echo "lutilisateur existe"; fi
    j'ai vraiment pas compris

  13. #33
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    /etc/passwd est un fichier qui contient les utilisateurs dans un format du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tomcat7:x:104:111::/usr/share/tomcat7:/bin/false
    mysql:x:117:129:MySQL Server,,,:/nonexistent:/bin/false
    postgres:x:118:130:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
    memcache:x:119:131:Memcached,,,:/nonexistent:/bin/false
    mongodb:x:120:65534::/home/mongodb:/bin/false
    ...
    tomcat7, mysql, postgres, memcache, mongodb sont des utilisateurs.

    Du coup pour un utilisateur présent dans la liste, grep te renvoie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ nom="memcache"
    $ grep "^$nom" /etc/passwd
    memcache:x:119:131:Memcached,,,:/nonexistent:/bin/false
    $ echo $?
    0
    De même si tu redirige stdout vers /dev/null (pour masquer la sortie) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ grep "^$nom" /etc/passwd > /dev/null
    $ echo $?
    0
    0 indique que le retour (ou statut) de la commande est "OK". Et grep renvoie status "OK" si l'expression en paramètre est bien "matchée" (vérifiée) dans au moins une des lignes du fichier.

    Lorsque l'expression n'est pas vérifiée, grep renvoie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ nom="inconnu"
    $ grep "^$nom" /etc/passwd > /dev/null
    $ echo $?
    1
    Donc le if considérer le retour de grep comme "FAUX".

    Autre chose, comme le dit Sve@r et comme mentionné dans la correction de cette exercice, il vaut mieux opter pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep "^$nom:" /etc/passwd > /dev/null
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ nom="tomcat"
    $ grep "^$nom" /etc/passwd
    tomcat7:x:104:111::/usr/share/tomcat7:/bin/false
    $ echo $?
    0
    Or l'utilisateur s'appel "tomcat7" et non "tomcat" tout court, donc le test sera erroné...

    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ nom="tomcat"
    $ grep "^$nom:" /etc/passwd
    $ echo $?
    1
    Voilà, j'espère que c'est plus clair

    Si tu veux plus de détails sur les structures bash telles que if, la commande grep, les retour des commandes et leur interprétation possible lire ceci : http://frederic-lang.developpez.com/...ux/prog-shell/

    Idriss

  14. #34
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ok.Idriss Voir le message
    Sve@r, je note que dans ta solution tu as pensé à l'option -r de read .
    Merci mais en fait je n'y ai pas pensé
    J'ai juste recopié le code initial de MR-SMOOT puis j'ai corrigé ses erreurs par rapport à mes remarques...

    Accessoirement, j'ai lu le help de read pour savoir à quoi correspondait cette option mais même si j'ai compris son action, je ne saisis pas encore son utilité

    Citation Envoyé par ok.Idriss Voir le message
    Autre chose, comme le dit Sve@r et comme mentionné dans la correction de cette exercice, il vaut mieux opter pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep "^$nom:" /etc/passwd > /dev/null
    Non non (rendons à César...). Je n'ai pas donné cette solution, j'ai juste dit que j'étais content que MR-SMOOT l'ai trouvée tout seul (suite à ma remarque sur "ro" et "oot")

    Citation Envoyé par MR-SMOOT Voir le message
    je veux savoir un truc comment le programme peut savoir que l'utilisateur existe avec cette commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if grep "^$nom" /etc/passwd > /dev/null; then echo "lutilisateur existe"; fi
    j'ai vraiment pas compris
    La majorité des commandes Unix sont booléennes et renvoient donc un état vrai ou faux. Et le if est en mesure d'évaluer cet état. D'ailleurs la syntaxe exacte de if c'est if commande. Bien que dans 99% des cas on écrive if test (la commande test est en effet une commande donc on reste cohérent avec les règles de base du Shell), rien n'interdit de tester d'autres commandes...

    Ainsi grep renvoie vrai quand il trouve et faux quand il ne trouve pas. De mon coté je me contente juste de l'appeler, non pas pour récupérer ce qu'il extrait (d'ailleurs ce qu'il extrait je l'envoie direct dans la poubelle) mais juste pour pouvoir détecter ce "trouvé/pas trouvé"...

    Autre exemple: détecter qu'un fichier existe ou pas (indépendamment de sa nature) en Bourne Shell (dans lequel l'option "-e" de test n'existe pas)
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/sh
    if ls -d $1 1>/dev/null 2>&1
    then
        echo "$1 existe"
    else
        echo "$1 n'existe pas"
    fi

    Autre exemple: traiter un flot d'informations (find, grep, last, etc...) ligne par ligne en Bourne Shell
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/sh
    commande_renvoyant_un_flot_de_plusieurs_lignes | while read ligne
    do
        echo "ligne traitée: [$ligne]"
    done

    Même principe: tant que read lit quelque chose il renvoie "vrai" et le stocke dans la variable invoquée en s'arrêtant au <return> marquant la fin de la ligne envoyée par la commande.
    Une fois que toutes les lignes ont été traitées, le read ne lisant plus rien renvoie "faux" et le while (syntaxe de base: while commande) arrête sa boucle...

    Pour l'instant la seule commande que j'ai trouvée qui ne puisse pas être utilisée de cette façon est expr. Car cette débile renvoie 0 (vrai) quand elle affiche n'importe quoi autre que 0; 1 (faux) quand elle affiche 0 et 2 (faux) quand elle ne peut pas faire son travail (erreur de syntaxe, etc)
    Et donc si je fais if expr 0 + 0, bien que tout ce soit bien passé, le test est considéré comme faux !!!
    Dans ce cas, il faut alors passer par l'évaluation explicite de son statut de retour.

    Exemple: détecter qu'un argument est un nombre entier ou pas - Principe: faire faire un calcul simple sur l'argument et regarder si le calcul a réussi ou pas
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/sh
    expr $1 + 0 1>/dev/null 2>&1; statut=$?
    if test $statut -lt 2
    then
        echo "$1 est un nombre entier"
    else
        echo "$1 n'est pas un nombre entier"
    fi
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #35
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 174
    Points : 113
    Points
    113
    Par défaut
    Merci beaucoup idriss et sve@r j'ai compris maintenant comment ça marche. Moi j'ai cru qu'il renvoie faux sauf si il y-a un erreur dans une commande mais maintenant j'ai compris comment ça se passe.

  16. #36
    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
    Citation Envoyé par ok.Idriss Voir le message
    /etc/passwd est un fichier qui contient les utilisateurs
    En espérant que les utilisateurs ne sont pas administrés sous yp ou autres nis...

    De même si tu redirige stdout vers /dev/null (pour masquer la sortie) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ grep "^$nom" /etc/passwd > /dev/null
    $ echo $?
    0
    Franchement, je trouve que ça manque de q ici!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ grep -q "^$nom" /etc/passwd
    $ echo $?
    0
    En plus, on peut espérer que "grep -q" est plus rapide: s'il trouve une occurrence sur la première ligne, il n'a pas besoin de continuer l'exploration du fichier jusqu'au bout pour retourner 0!

    [chipotage]
    Que se passe-t-il si l'on entre un nom d'utilisateur comme "tom.*"?
    [/chipotage]

  17. #37
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Autre exemple: détecter qu'un fichier existe ou pas (indépendamment de sa nature) en Bourne Shell (dans lequel l'option "-e" de test n'existe pas)
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/sh
    if ls -d $1 1>/dev/null 2>&1
    then
        echo "$1 existe"
    else
        echo "$1 n'existe pas"
    fi

    Autre exemple: traiter un flot d'informations (find, grep, last, etc...) ligne par ligne en Bourne Shell
    [code=bash]
    ici on peut jeter un œil du coté de la commande access (mais peut dans certains cas ne pas être très sécurisé si l'on en crois le man en C)
    http://linux.die.net/man/1/access

    et aussi du coté de stat si l'on souhaite des information complémentaires
    http://linux.die.net/man/1/stat
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  18. #38
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    ici on peut jeter un œil du coté de la commande access (mais peut dans certains cas ne pas être très sécurisé si l'on en crois le man en C)
    Je connais la primitive C access mais pas la commande access. D'ailleurs je ne la trouve pas sur ma Debian (pas incluse dans les packages par défaut ?) ce qui me semble dommage car le man me donne envie.
    Toutefois peut-on alors la proposer comme solution "généraliste" dans un exo shell ?
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  19. #39
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Je connais la primitive C access mais pas la commande access. D'ailleurs je ne la trouve pas sur ma Debian (pas incluse dans les packages par défaut ?) ce qui me semble dommage car le man me donne envie.
    Toutefois peut-on alors la proposer comme solution "généraliste" dans un exo shell ?
    je pense que cela dépend du niveau du tutoriel, pour des débutant il faut chercher a orienter vers les "best practice" et les commandes les plus courantes.
    pour les personnes un peu plus expérimenté c'est autre chose...
    ceci dit il est tout à fait possible de partir sur du débutant et citer dans la corrections quelques commandes intéressantes pour ceux qui souhaitent approfondir.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  20. #40
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 49
    Points : 34
    Points
    34
    Par défaut Convertisseur décimal binaire
    Voila une autre manière qui me parait compréhensible :

    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
     
    #!/bin/bash
     
    # Fonction de conversion
    function convert
    {
            i=7
            temp=$1
            while [[ $temp -ge 1 ]]
            do
                    array[$i]=$((temp % 2))
                    temp=$(($temp / 2))
                    ((--i))
            done
    }
     
    # Variables
    array=( 0 0 0 0 0 0 0 0 )
     
    # Main
     
    # Existence d'argument
    if [[ $# != 1 ]] ; then
            echo "Nombre d'argument incorrect"
            exit
    fi
     
    # On verifie qu'il s'agit d'un entier entre 0 et 255 
    if [[ $1 -eq 0 ]] ; then
            echo ${array[*]}
            exit
    elif ! let $1 ; then
            echo "$1 n'est pas un entier"
            exit
    elif [[ $1 -gt 256 ]] ; then
            echo "$1 > 255"
            exit
    fi
     
     
    convert $1 
    echo ${array[*]}
    Qu'en pensez vous?

Discussions similaires

  1. Exercice liste liée
    Par Isendar dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 30/05/2008, 07h50
  2. Liste chaînée , exercice simple et perte d'élément
    Par Alternative451 dans le forum C
    Réponses: 1
    Dernier message: 21/04/2008, 15h07
  3. Probleme exercice list
    Par Gebudi. dans le forum C++
    Réponses: 6
    Dernier message: 31/07/2006, 15h43

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