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 qui parcourt un fichier pour avoir la liste des paramètres


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut Script shell qui parcourt un fichier pour avoir la liste des paramètres
    Bonjour.

    J'ai fait un script shell dans lequel une fonction boucle sur une liste.
    Pour le moment la liste est dans le même fichier.
    Je souhaite mettre cette liste de paramètres dans un autre fichier et que ma fonction boucle sur les lignes de ce fichier.
    Je ne sais pas comment faire pour récupérer ma liste dans fichier avec cette structure :
    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #paramètres utilisés
    param1 #premier paramètre
    param2 #deuxième paramètre
    param3 #troisième paramètre
    ou un systeme clé valeur.

    Merci de votre aide.

  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,

    c'est un truc comme ça que tu cherches ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    declare -A tab  # declare un tableau associatif "tab"
     
    while read line; do
       if [[ "$line" =~ ^# ]]; then continue; fi    # on zappe les lignes de commentaires eventuels
       tab[${line%% *}]="${line#* }"
    done < fichier
     
    for key in "${!tab[@]}"; do
       value=${tab[$key]}
       echo "\"$key\" : \"$value\""
    done
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ ./script.bash
    "param1" : "#premier paramètre"
    "param3" : "#troisième paramètre"
    "param2" : "#deuxième paramètre"

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    Merci BufferBob.
    C'est à peu prés ça que je veux faire.
    Mon fichier "fichier" ressemble à ça
    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ ./script.bash
    "param1" : "#premier paramètre"
    "param3" : "#troisième paramètre"
    "param2" : "#deuxième paramètre"
    FIN
    Et les lignes servent de paramètres à :
    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while read line; do
       if [[ "$line" =~ ^# ]]; then continue; fi    # on zappe les lignes de commentaires eventuels
       fonction line
    done < fichier
    Je veux aussi zapper les éventuelles lignes vides et sortir quand j'arrive à la ligne = "FIN"

    PS ; je veux bien une explication détaillée de :
    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
     if [[ "$line" =~ ^# ]];

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Il faut apprendre à utiliser le manuel. Tout y est.
    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
           [[ expression ]]
                  Renvoie un état de 0 ou 1 selon l'évaluation de la condition expression. Les conditions sont composées de primitives décrites ci-dessous dans CONDITIONS. Le découpage en mots et le développement des chemins ne sont pas effectués sur les mots entre [[ et
                  ]] ;  le  développement  des tildes, des paramètres, des variables, le développement arithmétique, la substitution de commande et de processus, ainsi que la suppression des protections sont effectués. Les opérateurs conditionnels comme -f ne doivent pas
                  être protégés afin d'être reconnus comme primitives.
     
                  Lorsqu'ils sont utilisés avec [[, les opérateurs < et > ordonnent d'un point de vue lexicographique en utilisant les paramètres linguistiques régionaux actuels.
     
           Consultez la description de la commande interne test (consultez COMMANDES INTERNES DE L'INTERPRÉTEUR ci-dessous) pour la gestion des paramètres (c'est-à-dire des paramètres manquants).
     
           Quand les opérateurs == et != sont utilisés, la chaîne placée à droite de l'opérateur est considérée comme étant un motif dont la correspondance est recherchée selon les règles décrites ci-dessous dans Motifs génériques, comme si l’option extglob  de  l’inter‐
           préteur  était  activée.  L’opérateur = est équivalent à ==. Si l'option d'interpréteur nocasematch est activée, la mise en correspondance est effectuée sans tenir compte de la casse (différence majuscule/minuscule) des caractères alphabétiques. La valeur ren‐
           voyée est 0 si les chaînes correspondent (==), ou ne correspondent pas (!=), au motif et 1 sinon. Toute partie du motif peut être protégée pour forcer la partie protégée à correspondre en tant que chaîne.
     
           Un opérateur binaire supplémentaire, =~, est disponible, avec la même priorité que == et !=. Lorsqu'il est utilisé, la chaîne à droite de l'opérateur est considérée comme une expression rationnelle étendue et est mise en correspondance  en  conséquence  (comme
           avec regex(3)). La valeur renvoyée est 0 si la chaîne correspond au motif et 1 si elle ne correspond pas. Si l'expression rationnelle n'est pas syntaxiquement correcte, la valeur renvoyée de l'expression conditionnelle est 2. Si l'option d'interpréteur nocase‐
           match est activée, la mise en correspondance est effectuée sans tenir compte de la casse. Toute partie du motif peut être protégée pour forcer la partie protégée à correspondre en tant que chaîne. Les expressions entre  crochets  des  expressions  rationnelles
           doivent  être  traitées prudemment car les caractères de protection habituels perdent leur signification entre crochets. Si le motif est stocké dans une variable de l’interpréteur, la protection de développement de variable force le motif entier à correspondre
           en tant que chaîne. Les sous-chaînes mises en correspondance avec des sous-expressions entre parenthèses dans l'expression rationnelle sont sauvegardées dans la variable tableau BASH_REMATCH. L'élément d'indice 0 de BASH_REMATCH est la partie de la chaîne cor‐
           respondant à l'expression rationnelle complète. L'élément d'indice n de BASH_REMATCH est la partie de la chaîne correspondant à la n-ième sous-expression entre parenthèses.
    (Il faut lire jusqu'au bout)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Match-beginning-of-line operator (^) matches the empty string immediately after a newline, regardless of whether eflags, the execution flags of regexec(), contains REG_NOTBOL.
    ^ signifie donc le début de ligne.

    La condition teste donc si la ligne commence par un croisillon (#). C'est alors un commentaire.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    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
    on peut aussi recommander de se renseigner sur les formats de données. stfw: Comma Separated Values, champs à longueurs fixes, base de données...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    Merci.
    Ce que je cherchais à comprendre c'était

  7. #7
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    Bonnsoir.

    Finalement mon script ne fonctionne pas comme attendu.

    Lorsque je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :~/MKDIR/Sources$ ./mkdir.sh
    dans une console, je n'ai pas d'erreur mais le fichier de log n'est pas correct et aucun répertoire n'est créé.

    mkdir.sh
    Code shell : 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
    # fonction mkdir
     
    rep=/home/alain/MKDIR/Sources/
    rep_log=/home/alain/MKDIR/Logs/
    base=/home/alain/MKDIR/Rep_crees
     
    fichier=mkdir_rep.txt
    fic_log=monlog.txt
     
    fic_param=$rep$fichier
     
    log="$rep_log$fic_log"
     
    touch $log
    chmod 666 $log
     
    # date 
     
    echo `date` >> $log
     
    cd /home/alain/MKDIR/Rep_crees
     
    while read line; do
    	if [[ "$line" =~ ^# ]];
    	echo "commentaires : $line" >> $log
    	then continue;  # on zappe les lignes de commentaires eventuels
     
    	elif [[ -z "$line" ]]; 
    	echo "ligne vide" >> $log
    	then continue;  # on zappe les lignes vides
     
    	elif [[ "$line" == FIN* ]];
    	echo "Le fichier est traité : fin du traitement." >> $log
    	then break;     # le fichier est traitée
     
    	else
    	mkdir -p "$base$line" >> $log
     
    	fi
     
    done < $fic_param
     
     
    echo "traitement terminé sans erreur.">> $log
    echo  `date` >> $log

    mkdir_rep.txt
    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
    # paramètres
     
    # premier niveau
    base
    basebis
     
    # deuxième niveau
    base/IN
    base/OUT
    base/OK
    base/RJT
     
    basebis/Arch
    basebis/Log
     
     
    FIN

    monlog.txt
    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
    dimanche 23 juin 2019, 22:36:38 (UTC+0200)
    commentaires : # paramètres
    commentaires : 
    commentaires : # premier niveau
    commentaires : base
    commentaires : basebis
    commentaires : 
    commentaires : # deuxième niveau
    commentaires : base/IN
    commentaires : base/OUT
    commentaires : base/OK
    commentaires : base/RJT
    commentaires : 
    commentaires : basebis/Arch
    commentaires : basebis/Log
    commentaires : 
    commentaires : 
    traitement terminé sans erreur.
    dimanche 23 juin 2019, 22:36:38 (UTC+0200)

  8. #8
    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
    c'est parce que tu intercales les echo entre le test et les commandes "conditionnées".
    le if considère que seul le premier "cas" est à exécuter, puisque echo retourne toujours vrai.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    oups, merci.

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Quelle horreur !
    Tout simplement.

    elif [[ "$line" == FIN* ]];
    Tu confonds les caractères joker et les expressions régulières. Ici, c'est une expression régulière. Et "FIN*", comme tu l'écris, signifie F suivi de I, suivi de N en quantité indéterminée (même zéro).
    Donc pas ce que tu veux. N'est-ce pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ toto=FI; if [[ "$toto" =~ FIN* ]]; then echo OK;fi
    OK
    $ toto=FINN; if [[ "$toto" =~ FIN* ]]; then echo OK;fi
    OK
    $ toto=FICHIER; if [[ "$toto" =~ FIN* ]]; then echo OK;fi
    OK
    $ toto=FACHER; if [[ "$toto" =~ FIN* ]]; then echo OK;fi
    $
    mkdir -p "$base$line" >> $log
    Il manque un "/" entre "base" et "line". Les dossiers ont possiblement été créés mais pas avec le nom que tu crois.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    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
    non, non, [[ $var == globbing* ]] est correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ var=FIN;  [[ $var == FIN* ]]; echo $?
    0
    $ var=FINal;  [[ $var == FIN* ]]; echo $?
    0
    $ var=cassoulet;  [[ $var == FIN* ]]; echo $?
    1
    les guillemets sont facultatifs entre [[ ]].
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Euh .... on parlait de la cravate =~, derrière laquelle, il y une expression rationnelle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ toto=FI; if [[ $toto == FIN* ]]; then echo OK;fi
    $ toto=FI; if [[ $toto =~ FIN* ]]; then echo OK;fi
    OK
    == ----> jokers classiques.
    =~ ----> expression rationnelle

    Vrai ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  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
    vrai.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Script shell qui reconstitue une arborescence de fichiers
    Par cacoole dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 19/02/2014, 16h44
  2. Script shell qui format mon fichier
    Par mlkndiaye dans le forum Linux
    Réponses: 0
    Dernier message: 21/05/2010, 17h32
  3. Réponses: 3
    Dernier message: 09/11/2009, 12h42
  4. Réponses: 0
    Dernier message: 03/06/2008, 11h44
  5. Réponses: 7
    Dernier message: 21/04/2005, 15h55

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