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 :

Boucle While dans un IF


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Par défaut Boucle While dans un IF
    Bonjour,
    Je suis débutant en shell et je cherche à copier plusieurs lignes d'un fichier (correspondant à des fichiers XML) vers un autre emplacement.

    Voici mon 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
    #!/bin/bash 
    source=/chemin1/
    cible=/chemin2/
     
    fichier="$(find $source -mmin -$((`date +%H`*60)) -iname '*.xml')" 
     
    # copie du fichier si le fichier du jour est existant 
    if [ -f "$fichier" ] 
    then 
    while read line
    echo "$(date +%d/%m/%y-%kh%M) : copie du fichier $line" >> $(date +%Y-%m-%d).copie.log 
    cp "$line" $cible
    done < $fichier
    else 
    echo  "$(date +%d/%m/%y-%kh%M) : pas de nouveau fichier pour ce jour" >> $(date +%Y-%m-%d).copie.log  
    fi
    Le IF me sert à tester si des fichiers existent pour un jour J. S'il n'y a pas de fichiers, on ne doit rien copier.

    Mon problème, c'est que cela ne fonctionne pas. Le résultat me renvoie systématiquement vers le ELSE, même lorsqu'il y a des fichiers dans le répertoire source.

    Pouvez-vous m'aider ?

    Je vous remercie !!

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    C'est normal, if [ -f "$fichier" ] teste si un fichier existe, or, $fichier est une variable et non un fichier

    Il te faut tester avec if [ -n "$fichier" ] qui vérifie si ta variable n'est pas vide...

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    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 134
    Par défaut
    Si ta commande find retourne plusieurs fichiers, la variable fichier contient ces noms de fichiers séparés par un espace.
    La commande [ -f "fic1 fic2" ] cherche le fichier fic1 fic2, contenant un espace dans son nom, et non les fichiers fic1 et fic2.

    Tu peux simplifier tes tests et boucles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    log=$(date '+%Y-%m-%d').copie.log
    nbfic=0
    find ${source} -mmin -$(( $(date '+%H') * 60 )) -iname '*.xml' | while read nomfic
      echo "$(date '+%d/%m/%y-%kh%M') : copie du fichier ${nomfic}" >> ${log} 
      cp "${nomfic}" ${cible}
      (( nbfic += 1 ))
    done 
    (( nbfic )) || echo  "$(date +%d/%m/%y-%kh%M) : pas de nouveau fichier pour ce jour" >> ${log}
    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.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    En dehors du mot clef "do" manquant, je ne comprends pas trop ce cp "$line" $cible en ligne 12. En tout état de cause, la variable "$line" contient une ligne du fichier traité et non le fichier lui-même. Or la commande cp copie des fichiers, pas des lignes situées dans les fichiers...

    Accessoirement tu gagneras en productivité et en mise à jour si tu prends l'habitude d'indenter proprement ton code.

    Le même code indenté

    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
    #!/bin/bash 
    source=/chemin1/
    cible=/chemin2/
     
    fichier="$(find $source -mmin -$((`date +%H`*60)) -iname '*.xml')" 
     
    # copie du fichier si le fichier du jour est existant 
    if [ -f "$fichier" ] 
    then 
          while read line
                echo "$(date +%d/%m/%y-%kh%M) : copie du fichier $line" >> $(date +%Y-%m-%d).copie.log 
                cp "$line" $cible
          done < $fichier
    else 
          echo  "$(date +%d/%m/%y-%kh%M) : pas de nouveau fichier pour ce jour" >> $(date +%Y-%m-%d).copie.log  
    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]

  5. #5
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Par défaut
    Merci pour votre aide.

    En fait, à travers ce script, je récupère le nom des fichiers XML trouvés dans un répertoire ($source), et je les inscrits dans un fichier ($fichier).

    Ensuite, pour chaque ligne inscrite, je copie la ligne (donc le fichier XML) vers une destination ($cible).

    J'avais déjà fait un tel script qui fonctionne, mais sans la condition IF. Ce qui m'intéresse dans ce cas, c'est de pouvoir retourner un résultat si la condition n'est pas remplie.

    Par contre, je me complique peut être la vie avec cette méthode. Si vous en avez d'autres, je suis preneur.

    al1_24, merci pour ta réponse. Ton script renvoie une erreur au niveau du "While" :

    line 10: Erreur de syntaxe près du symbole inattendu « done »

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    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 134
    Par défaut
    Comme l'a justement relevé Sve@r, il manque un do entre les lignes 3 et 4.
    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.

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

Discussions similaires

  1. boucle "while" dans un sous-formulaire
    Par philebaucis dans le forum VBA Access
    Réponses: 4
    Dernier message: 02/04/2017, 06h15
  2. Boucle "while" dans un fichier Javascript ?
    Par Boris56 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/04/2010, 12h31
  3. Boucle while dans tableau
    Par TheRealMike dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/06/2009, 19h50
  4. Problème de boucle while dans un popup
    Par drogba72 dans le forum Langage
    Réponses: 2
    Dernier message: 06/02/2009, 14h19
  5. probleme de boucle while dans une procedure stockée
    Par aboulemagnifique dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 08/08/2007, 12h39

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