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 horaires de bus


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 16
    Points : 17
    Points
    17
    Par défaut Script horaires de bus
    Bonjour!
    J'ai souhaité m'entraîner au shell en créant un script qui dit quand le prochain bus est sensé passer. Les horaires sont stockés dans un fichier qui contient une suite d'horaires sous la forme 15h45, avec un horaire par ligne.
    Mon script fonctionne, mais il ne semble d'une part pas du tout optimal, et je ne vois pas comment faire si dans l'heure qui suit il n'y a aucun bus disponible (par exemple si il est 18h30, et qu'il n'y a aucun bus entre 18h30 et 19h).
    Voici 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
    #!/bin/bash
    OLDIFS=$IFS
    set $(date)
    jour_semaine=$1
    IFS=:
    set $5
    heure=$1
    minute=$2
    if [ $jour_semaine = "samedi" ]
    then
    horaire=horaires_samedi
    elif [ $jour_semaine = "dimanche" ]
    then
    horaires=horaires_dimanche
    else horaires=horaires_semaine
    fi
    IFS=$OLDIFS
    horairesmodif=`grep $heure $horaire | cut -d h -f 2`
    echo "$horairesmodif"
    for min in $horairesmodif
    do
    if [ $min -gt $minute ]
    then
    let "c = min - minute"
    echo "Bus dans $c minutes"
    fi
    done
    Merci d'avance
    Raphaël

  2. #2
    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
    Bonjour,

    c'est bien d'utiliser les paramètres positionnels, mais tu pourrais aussi utiliser le formattage de la commande date pour créer un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau=( $(date +'%A %H %m') )
    on sait que le jour est le premier élément du tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo ${tableau[0]}
    samedi
    ça évite les manipulations de l'IFS.

    apparemment, tu n'a testé que sur samedi, car le nom des variables pour le dimanche et semaine ne coïncident pas

    plutôt que grep, j'aurais utiliser sed avec un intervalle entre l'heure actuelle et l'heure actuelle +1heure (avec date pour faire plus simple )
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    merci pour l'aide , c'est vrai que c'est plus simple avec un tableau.
    Mais je n'arrive pas à bien comprendre la structure : tableau=( $(date +'%A %H %m') ), à quoi correspond le +, et pourquoi mettre %A %H et %m entre guillemets ?
    Je ne connais pas sed, d'après le manuel j'ai cru comprendre que ça permettait de filtrer des données. Qu'est ce que ça apporte par rapport à grep ?

  4. #4
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par raphael2202 Voir le message
    Je ne connais pas sed, d'après le manuel j'ai cru comprendre que ça permettait de filtrer des données. Qu'est ce que ça apporte par rapport à grep ?
    La différence est très bien expliquer sur une réponse de frp31 que tu retrouveras ici (je n'aime pas spoiler ) http://www.developpez.net/forums/d97...opier-fichier/

  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
    Citation Envoyé par raphael2202
    à quoi correspond le +, et pourquoi mettre %A %H et %m entre guillemets ?
    le signe plus est l'indicateur de formattage; format qui est mis entre apostrophes parce qu'il y a des espaces.
    j'aurais pu écrire il faut protéger les espaces.
    les apostrophes sont mieux car, par exemple, cron interprète les %, donc avec des apostrophes on protège tout.

    si tu ne connais pas bien une commande, n'hésites pas à consulter sa page de man !
    --help est généralement disponible pour toutes les commandes.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    J'ai un dernier problème avec let : quand je fais let "c = min - minute" et que soit min soit minute sont sous la forme 01 ou 04, il m'affiche une erreur.

  7. #7
    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
    fais précéder le format horaire d'un tiret pour retirer les zéros.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    D'accord, merci beaucoup

  9. #9
    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 aerane Voir le message
    La différence est très bien expliquer sur une réponse de frp31 que tu retrouveras ici (je n'aime pas spoiler ) http://www.developpez.net/forums/d97...opier-fichier/
    Pour info, chaque post est présenté avec un bandeau contenant la date à gauche et un 'permalink' à droite qui s'affiche sous la forme '# <numéro du post dans le thread>' (excusez mon franglais qui me permet de pallier les déficiences de mon français) et qui contient, comme son nom l'indique, un lien permanent. Si on clique droit + copier l'adresse du lien ou si on clique gauche et qu'on copie l'adresse apparaissant dans la barre de navigation, on obtient l'adresse du permalink lui-même.

    En l'occurrence, pour ta citation, le permalink est:

    http://www.developpez.net/forums/d97...r/#post5471891

    Tu peux aussi écrire, sans spoiler:

    Citation Envoyé par frp31 Voir le message
    la difference entre sed et grep ?
    grep = chercheur de chaines
    sed = langage d'edition de fichier par script (idem que vi -c) la difference avec vi -c "script" fichier c'est que sed est standardisé, alors que vi depend de la version vi/vim/gvi etc...

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    Le script final
    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
    #!/bin/bash
    tableau=( $(date +'%-A %-H %-M') )
    minute=${tableau[2]}
    if [ ${tableau[0]} = "samedi" ]
    then
    horaire=/home/raphael/Documents/Programmation/Shell/horaires_samedi
    elif [ ${tableau[0]} = "dimanche" ]
    then
    horaire=/home/raphael/Documents/Programmation/Shell/horaires_dimanche
    else horaire=/home/raphael/Documents/Programmation/Shell/horaires_semaine
    fi
    horairesmodif=`grep ^${tableau[1]} $horaire | sed -e 's/\([0-9][0-9]\)h\([0-9][0-9]\)/\2/' | sed -e 's/^0//'`
    for min in $horairesmodif
    do
    if [ $min -gt $minute ]
    then
    let "c = min - minute"
    echo "Bus dans $c minutes"
    fi
    done
    let heure_m=${tableau[1]}+1
    horairesmodif2=`grep ^$heure_m $horaire | sed -e 's/\([0-9][0-9]\)h\([0-9][0-9]\)/\2/' | sed -e 's/^0//'`
    for min in $horairesmodif2
    do
    let d=60-${tableau[2]}
    let e=d+min
    echo "Bus dans $e minutes"
    done
    echo "Valable jusqu'au 7 juillet 2013"
    Je suis obligé de garder un grep, car je n'arrive pas à insérer une variable dans le sed. Une solution ?
    Et sed ne reconnaît pas les expressions régulières du type [0-9]{2}, le fait de mettre un -r (--regexp-extended) ne change rien à l'affaire.

  11. #11
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Citation Envoyé par raphael2202 Voir le message
    Je suis obligé de garder un grep, car je n'arrive pas à insérer une variable dans le sed. Une solution ?
    Soit tu entoures l'expression avec des quotes doubles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "s/${mavar}/autre_chose/" fichier
    Soit, avec des quotes simples, tu refermes l'expression avant ta variable et tu la rouvres ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/'"${mavar}"'/autre_chose/' fichier
    Citation Envoyé par raphael2202 Voir le message
    Et sed ne reconnaît pas les expressions régulières du type [0-9]{2}, le fait de mettre un -r (--regexp-extended) ne change rien à l'affaire.
    Si mais il faut les protéger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/\([0-9]\{2\}\)h\([0-9]\{2\}\)/\2/'
    Par contre avec l'option "-r" il ne faut pas les protéger, ni les parenthèses des références-arrières :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r -e 's/([0-9]{2})h([0-9]{2})/\2/'
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    Quand je transforme le code en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    horairesmodif=`sed -e -r "s/(${tableau[1]})h([0-9]{2})/\2/"`
    une erreur s'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: -e expression n°1, caractère 1: commande inconnue: `-'

  13. #13
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par raphael2202 Voir le message
    une erreur s'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: -e expression n°1, caractère 1: commande inconnue: `-'
    Il faut mettre le "-r" avant le "-e"
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    Merci beaucoup, la syntaxe est loin d'être simple
    J'ai un dernier soucis, après modification, le script bloque sur le premier sed
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    horairesmodif=`sed -r -e "s/(${tableau[1]})h([0-9]{2})/\2/" | sed -e "s/^0//"`
    Je vois pas ce qui pose problème ici...

  15. #15
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par raphael2202 Voir le message
    Je vois pas ce qui pose problème ici...
    Il manque la matière à traiter : "$horaire"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    horairesmodif=`sed -r -e "s/(${tableau[1]})h([0-9]{2})/\2/"  ${horaire} | sed -e "s/^0//"`
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    C'est vrai que j'ai supprimé le grep
    Merci encore !!

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

Discussions similaires

  1. BDD Horaire de bus
    Par uwestern dans le forum Modélisation
    Réponses: 4
    Dernier message: 05/10/2012, 10h35
  2. Recherche Logiciel pour créer horaire de bus
    Par shmouki dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 22/09/2010, 09h27
  3. Problème PHP/Mysql script horaire d'un planning
    Par jessica76 dans le forum Langage
    Réponses: 3
    Dernier message: 01/04/2010, 19h30
  4. [CS4] Formulaire dynamique pour horaire de bus
    Par shmouki dans le forum Dreamweaver
    Réponses: 3
    Dernier message: 17/04/2009, 11h32
  5. [MPD] horaires de bus
    Par sorcade dans le forum Schéma
    Réponses: 8
    Dernier message: 01/09/2008, 17h45

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