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 :

aide sur comparaison et condition en shell


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 106
    Par défaut aide sur comparaison et condition en shell
    Bonjour,

    Voici mon probleme:
    C'est de la programmation shell sous linux redhat 5 ES.
    A la base il y a 2 fichiers param_user et param_carac. Et un script en shell, qui une fois exécuté, collectera des infos du 1er et 2eme fichiers et les mettra en sortie dans un fichier passwd.

    # param_user contient les lignes ecrit comme ceci = login:Id:groupe_service (7 groupes services total)
    exemple = toto:900:admin , seulement 3 colonnes par lignes

    # param_carac contient Id:groupe_archi:groupe_service:etc ...
    ou groupe_service:group_archi: etc ...
    //il n'y a que 3 groupe architecture A , B et C
    // il peut y avoir 6 colonnes max
    // autant de ligne que d'utilisateur (50)
    exemple = 800:A:admin:etc...
    500:B:reseau:etc...
    223:A:etude:etc...
    900:A:admin:etc...
    500:C:admin:etc...
    admin:C:etc...
    etude:B:etc...


    lorsque que j'executerai le script ./script toto group_service
    exemple (et seulement de cette maniere ci, avec 2 arguments)
    ==> ./script toto admin
    reprenons maintenant les exemples comme énoncés.

    Le programme doit chercher l'Id (donc 900, id de toto) dans le premier fichier param_user et le compare avec les id du 2eme fichier param_carac.

    # etape 1 :Si c'est le meme id, on copie la ligne du fichier param_carac où l'Id a été trouvé et on le renvoie dans un fichier nommé passwd

    # etape 2 : si il ne le trouve pas le meme id, on compare désormais le groupe_service du user situé dans param_user donc ici admin et effectuer le meme procédé que l'étape 1


    Pouvez vous me donner les idées de départ ? pour que je puisse effectuer le programme .
    je ne vois pas comment 1) associer toto à l'id, faut il que toto et id soit dans la meme ligne ?
    2) étape 1 comparer $1(entrer en paramètre) à une donnée d'un fichier
    3) étape 2 comparer $2(entrer en paramètre) apres avoir montrer que étape 1 ne donnait rien
    4) probleme se situant au niveau de la comparaison en shell

    je vois comment -le renvoyer dans un fichier >> passwd
    -choisir une ligne avec colonne grep nom |-d ":" -f1
    - effectuer une boucle if

    merci de votre aide

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 837
    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 837
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par monsieur77 Voir le message
    Bonjour,

    Voici mon probleme:
    C'est de la programmation shell sous linux redhat 5 ES.
    A la base il y a 2 fichiers param_user et param_carac. Et un script en shell, qui une fois exécuté, collectera des infos du 1er et 2eme fichiers et les mettra en sortie dans un fichier passwd.

    # param_user contient les lignes ecrit comme ceci = login:Id:groupe_service (7 groupes services total)
    exemple = toto:900:admin , seulement 3 colonnes par lignes

    # param_carac contient Id:groupe_archi:groupe_service:etc ...
    ou groupe_service:group_archi: etc ...
    //il n'y a que 3 groupe architecture A , B et C
    // il peut y avoir 6 colonnes max
    // autant de ligne que d'utilisateur (50)
    exemple = 800:A:admin:etc...
    500:B:reseau:etc...
    223:A:etude:etc...
    900:A:admin:etc...
    500:C:admin:etc...
    admin:C:etc...
    etude:B:etc...


    lorsque que j'executerai le script ./script toto group_service
    exemple (et seulement de cette maniere ci, avec 2 arguments)
    ==> ./script toto admin
    reprenons maintenant les exemples comme énoncés.

    Le programme doit chercher l'Id (donc 900, id de toto) dans le premier fichier param_user et le compare avec les id du 2eme fichier param_carac.

    # etape 1 :Si c'est le meme id, on copie la ligne du fichier param_carac où l'Id a été trouvé et on le renvoie dans un fichier nommé passwd

    # etape 2 : si il ne le trouve pas le meme id, on compare désormais le groupe_service du user situé dans param_user donc ici admin et effectuer le meme procédé que l'étape 1


    Pouvez vous me donner les idées de départ ? pour que je puisse effectuer le programme .
    je ne vois pas comment 1) associer toto à l'id, faut il que toto et id soit dans la meme ligne ?
    2) étape 1 comparer $1(entrer en paramètre) à une donnée d'un fichier
    3) étape 2 comparer $2(entrer en paramètre) apres avoir montrer que étape 1 ne donnait rien
    4) probleme se situant au niveau de la comparaison en shell

    je vois comment -le renvoyer dans un fichier >> passwd
    -choisir une ligne avec colonne grep nom |-d ":" -f1
    - effectuer une boucle if

    merci de votre aide
    C'est marrant ! C'est le genre de truc que je donne à mes élèves quand je donne des cours shell

    Bon, idées de départ
    grep "machin" fichier => te donne la (ou les) lignes de "fichier" contenant "machin" ou <rien> s'il n'a pas trouvé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    info=`grep "^toto:" param_user`
    if test -n "$info"
    then
         # Trouvé
         ...
    else
         # Pas trouvé
         ...
    fi
    Extraire un champ d'une info => echo $info |cut...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    id=`echo "$info" |cut -f2 -d:`
    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]

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 106
    Par défaut
    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
    # en executan ./script toto
    #voici le programme pour la 1ere étape,qui cherche l'id 
    #par rapport au nom taper en paramètre
     
    #!/bin/bash
     
    info=`grep "^$1:" param_user`
    if test -n "$info"
    then
        id=`echo "$info" |cut -f2 -d ":"`
        echo "$info" ...?
     # maintenant il faut comparé cette id avec les id présents dans le fichier param_carac
     # si c'est le meme, on copie la ligne où l'id se trouve (donc dans param_carac)
     # et le rediriger vers fichier passwd
    # sinon on passe à létape 2 qu'on verra plus tard, une fois ce pb résolu.
    else
         echo "login inexistant"
     
    fi
    une idée de début pour comparer un mot avec un autre?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 106
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    info=`grep "^$1:" param_user`
    if test -n "$info"
    then
        id=`echo "$info" |cut -f2 -d ":"`
    #   if [ "$id" = "id du fichier param_carac"] 
    #    then
    #    echo "la ligne dont l'id est contenu " >> passwd
     else
         echo "login inexistant"
     
    fi
    je n'arrive pas a faire ce qui est écrit, j'ai éssayé avec les grep et find
    mais il ne compare pas si c'est égale, il affiche les 2 Id ds passwd ...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 106
    Par défaut
    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
    #!/bin/bash
     
    info=`grep "^$1:" param_user`
    if test -n "$info"
    then
        id=`echo "$info" |cut -f2 -d ":"`
        c=`grep "id" param_carac`
        if [ "$id" = "$c" ] 
        then
        echo "$c" >>passwd
        fi
    else
         echo "login inexistant"
     
    fi
    Il n'y a rien dans passwd une fois le script executé ./script toto
    pourtant toto est bien dans param_user et param_carac ...

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 837
    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 837
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par monsieur77 Voir le message
    une idée de début pour comparer un mot avec un autre?
    Oui. Te faut d'abord récupérer cet autre mot (par exemple dans la variable "id_autre"). Tu as su récupérer ton 1er mot avec grep et cut, tu sauras récupérer le 2° de la même façon.

    Ensuite, la comparaison est très simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if test "$id" = "$id_autre"
    then
        ...
    else
        ...
    fi
    Mais il me semble que t'as pas besoin de comparer ton id avec celui contenu dans param_carac. Tu as récupéré un id dans la variable "$id", il te suffit d'utiliser cet id dans un grep que tu feras sur param_carac => tu récupèreras toute la ligne correspondante...

    Conseil1: en shell, faut jamais vouloir aller trop vite et vouloir tout faire en une instruction. On n'est pas en C. Il te faut découper chaque problème en opérations vraiment élémentaires qui pourra ensuite être faite par une commande simple (comme je t'ai montré pour le grep et le cut)...

    Conseil2: avant de mettre un ensemble de commandes dans un script, teste-les une par une pour voir ce que ça fait et comprendre son fonctionnement. Je te dis de faire un "grep" alors pars directement en ligne de commande et tape directement ton "grep ...". Une fois que t'auras la bonne syntaxe, que le résultat sera conforme à ce que tu cherches, ben tu mets ta commande dans le script...
    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. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 106
    Par défaut enfin ! mais encore souci
    Apres avoir testé, réessayer, exécuté de nombreuses fois , ca marche !
    mais le souci c'est le contenu du fichier passwd. Une fois les 2 lignes détécter et copier dans le fichier, elles apparaissent comme ceci :

    toto:800:admin
    800:trt:/home/test

    je voudrais qu'elles soient en une seul ligne mais je ne trouve pas
    pourtant "$d $p " >>passwd devrait les mettre en ligne ?
    remarque : ce n'est pas grave si l'ID apparait 2 fois ou autre donnée redondantes, car pour la suite de mon programme j'effacerai le fichier.

    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
    ./script toto 
     
    #!/bin/bash
    If  [  $# -ne 1 ] ; then
    	Echo  “Usage : $0  [nom] [service]”;
    Exit 2 ;
    fi
     
     
    // Etape 1 : chercher si login existe dans param_user, si oui on stock la ligne dans passwd et passe etape 2
    					      Si non login inexistant
     
    P=`grep –c “^$1:” param_user`
     
    If [$p” =  “1]
     
    Then 
           P=`cat param_user | grep ^$1: ` 	// une fois trouvé on garde la ligne A
     
    // Etape 2 : cherche à  comparer l’id de toto dans param_user au fichier param_carac
    Si identique, on copie la ligne du fichier param_carac et  on met dans >>passwd
    Si non on compare désormais le service (dev) et effectue etape 2
     
    	info=`grep "^$1:" param_user` 		// cherche login dans param_user
    	if test -n "$info"
    	then
    		id=`echo "$info" | cut -f2 -d ":"` //cherche l’id se trouvant dans la ligne param_user
    		c=`grep -c "$id" param_carac` // on prend la ligne la ligne où se trouve l’id dans le fichier 								param_carac
     
    		if [ "$c" = "1" ] 
    		then
    			c=`grep "$id" param_carac `
    			echo « $p : $c »  >>passwd
     
    		fi
     
     
    Else
           Echo “erreur ! cet utilisateur est inexistant”
    fi

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 837
    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 837
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par monsieur77 Voir le message
    je voudrais qu'elles soient en une seul ligne mais je ne trouve pas pourtant "$d $p " >>passwd devrait les mettre en ligne ?
    Exact. Cela signifie donc que ta variable "$p" ou "$c" est elle-même constituée de 2 lignes.
    Pour le vérifier, affiche donc "[$p] [$c]" (avec les crochets qui te montreront où commence et où finit chaque variable...

    Citation Envoyé par monsieur77 Voir le message
    remarque : ce n'est pas grave si l'ID apparait 2 fois ou autre donnée redondantes, car pour la suite de mon programme j'effacerai le fichier.
    Certes... mais c'est toujours dommage de ne pas se préoccuper d'un bug aussi minime soit-il...

    Citation Envoyé par monsieur77 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    p=`grep –c “^$1:” param_user`
    if [$p” =  “1]
    then 
           P=`cat param_user | grep "^$1:" `
    C'est dommage que tu fasses 2 grep quasiment identique pour chaque action (une fois pour vérifier, une 2° fois pour récupérer) car tu peux récupérer et vérifier en même temps (style si t'as rien récupéré c'est que l'info n'y est pas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    P=`grep "^$1:" param_user`
    if [ -n "$p" ]
    then 
           # Pas besoin ici de refaire "grep" puisque "p" est déjà rempli...
    else
           # Ici, "p" est vide donc l'argument "$1" n'est pas dans "param_user"
    fi
    Dernier détail, mettre des variables au nom si peu significatif ($p, $c) n'est pas une bonne idée => au fur et à mesure que t'avances dans ton programme, tu risques de perdre (dans ta tête) le but et le contenu de tes variables. Force-toi, quand tu veux créer une variable, à te dire "à quoi va-t-elle servir ? Stocker une ligne ? Un nom ? Un compteur ?" et mettre des noms appropriés "$lig, $nom, $cpt".
    C'est un petit effort minime à faire mais il te permettra ensuite d'avancer 2 fois plus vite dans l'écriture de ton code (tu perdras pas de temps à te dire "à quoi sert p déjà ?") et évitera les bugs (recréer une 2° variable parce que t'as oublié que l'info était déjà stockée dans une 1ère et avoir donc au final 2 infos identiques dans 2 variables différentes avec le risque de voir les infos diverger au fur et à mesure que t'écris ton code)
    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]

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

Discussions similaires

  1. Aide sur requete SQL + Conditions
    Par Elbozo dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 16/09/2010, 10h13
  2. [XL-2007] Aide sur une condition
    Par Nickname dans le forum Excel
    Réponses: 9
    Dernier message: 21/08/2009, 10h00
  3. besoin d'aide sur tri shell
    Par eaglevmt-4 dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 30/12/2008, 17h35
  4. Demande d'aide sur macro a double conditions
    Par zinebs dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/11/2007, 23h23

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