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 :

Shell : une erreur persiste


Sujet :

Linux

  1. #1
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 241
    Points
    20 241
    Par défaut Shell : une erreur persiste
    Salut à tous ,

    J'ai pour objectif de faire un petit script shell qui, lancé par un cron me permettra de supprimer des fichiers "périmé".
    L'idée est là , le script aussi mais j'ai une erreur que je ne sait pas régler (je comprend pas pourquoi y'a une erreur en fait :/

    #! /bin/bash
    # Configuration
    perime=1200
    heureserv=`date '+%H'`
    minuteserv=`date '+%M'`
    secserv=`date '+%S'`
    timeserv=$[($heureserv * 3600)+($minuteserv * 60)+$secserv]
    # Liste des fichier
    listing=`ls`
    for i in $listing
    do
    element="$i"
    if [ -d $element ]
    then
    types=`ls -la -d $element | cut -c0-1`
    else
    types=`ls -la $element | cut -c0-1`
    fi

    if [ $types = 'l' ]# si lien symbolique
    then
    heurefic=`stat -c %x /home/chemin/vers/fichier/$element | awk '{print $4}' |cut -c0-2`
    minutefic=`stat -c %x /home/chemin/vers/fichier/$element | awk '{print $4}' |cut -c4-5`
    secfic=`stat -c %x /home/chemin/vers/fichier/$element | awk '{print $4}' |cut -c7-8`
    timefic=$[($heurefic * 3600)+($minutefic * 60)+$secfic]
    resultat=$[$timeserv - $timefic]

    if[ $resultat -gt $perime ]
    then# /!\ erreur à cette ligne /!\
    rm $element
    fi
    fi
    done
    exit 0
    L'erreur retournée est :
    ./cleaner.sh: line 28: syntax error near unexpected token `then'
    ./cleaner.sh: line 28: ` then'

    Donc apperement il n'aime pas ma condition if mais pourquoi ?

    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Désolé si je te semble un peu dur mais quel complication !

    J'apporte quand même quelques améliorations

    1 - Pour tester si c'est un lien symbolique -> if [ -L $fichier ]
    2 - Tu faire une if else qui contient le même code


    un proposition de 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
     
    #!/bin/sh
    fichierstamp=/tmp/coucou
     
    if [ -e $fichierstamp ]
    then
            for fichier in  $( find /tmp -type l  -not -newer $fichierstamp  )
            do
                    echo " Fichier $fichier"
                    echo "traitement"
            done
    touch $fichierstamp
    else touch $fichierstamp
    fi

  3. #3
    Membre à l'essai
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    19
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 19
    Points : 19
    Points
    19
    Par défaut
    en fait ton erreur et toute bete j'ai eu la meme recemment c'est juste que tu a oublié de mettre un espace entre le if et le crochet qui le suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if [ $resultat -gt $perime ]
    then# /!\ erreur à cette ligne /!\
    rm $element
    fi

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 241
    Points
    20 241
    Par défaut
    Citation Envoyé par becket
    Désolé si je te semble un peu dur mais quel complication !

    J'apporte quand même quelques améliorations

    1 - Pour tester si c'est un lien symbolique -> if [ -L $fichier ]
    2 - Tu faire une if else qui contient le même code
    Pas de problème , je suis pas bon en shell et tout amélioration et conseils sont toujours les bienvenue

    en fait ton erreur et toute bete j'ai eu la meme recemment c'est juste que tu a oublié de mettre un espace entre le if et le crochet qui le suit
    Merci Garga, vraiement le genre d'erreur qu'on trouve jamais seul ^^

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    hum hum....
    le script peut tout a fait fonctionner mais l'usage de la commande find reste probablement meilleur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find / -type f -utime +X -exec rm {} \;
    pourrait faire la même chose : l'otion utime (ou atime ou mtime) celon le but recherché permettra de selectionner un fichier en fonction de son ancienneté (creation, accés, misa ajour) et d'effectuer l'action apres le -exec.

    voir le man find pour le detail.

  6. #6
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par MarcG
    hum hum....
    le script peut tout a fait fonctionner mais l'usage de la commande find reste probablement meilleur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find / -type f -utime +X -exec rm {} \;
    pourrait faire la même chose : l'otion utime (ou atime ou mtime) celon le but recherché permettra de selectionner un fichier en fonction de son ancienneté (creation, accés, misa ajour) et d'effectuer l'action apres le -exec.

    voir le man find pour le detail.
    Tout à fait, l'ennui avec l'utilisation des options atime ou ctime est ( a moins de jouer avec un daystart ) il compte un nombre de jours alors que le script original à une périodicité d'une vingtaine de minutes

Discussions similaires

  1. Récupérer une erreur d'une commande Shell
    Par flieppo dans le forum VB.NET
    Réponses: 1
    Dernier message: 03/07/2009, 11h20
  2. shell retourne une erreur
    Par nymus7 dans le forum Langage
    Réponses: 3
    Dernier message: 07/08/2008, 18h03
  3. Ne pas s'arreter sur une erreur de shell.
    Par Mimisio dans le forum Ruby
    Réponses: 1
    Dernier message: 07/10/2007, 00h14
  4. intercepter une erreur de shell
    Par Sephy dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 15/07/2006, 11h37
  5. Ne pas formater une erreur
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 2
    Dernier message: 18/03/2003, 14h13

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