Forum Programmation.shell Bash : tester des nombres décimaux [Résolu]

Posté par  (site web personnel) .
Étiquettes : aucune
0
29
sept.
2012

Bonjour,

je voudrais tester qu'une variable est un nombre décimal (avec un point comme séparateur décimal) compris entre -90 et 90. En cas de succès l'étape suivante sera de la convertir en degré - minute - seconde.

Mes recherches m'ont amené à considérer la commande bc -l mais je n'y arrive toujours pas.

Une bonne âme aurait-elle la gentillesse de me donner un coup de main ?

Merci d'avance

  • # locale et mathematiques

    Posté par  . Évalué à 1.

    je dis surement une connerie, mais ta locale est surement en francais
    le . n'est donc pas un separateur unité.dixieme

    il faut donc, soit passer en locale anglaise/americaine,
    soit changer tes . en ,

  • # J'ai fini par trouver

    Posté par  (site web personnel) . Évalué à 2.

    Comp=`echo "$Latitude < 90 && $Latitude > -90" | bc -l 2> /dev/null` 
    if [ -z $Comp ]; then exit 1;fi
    if [ $Comp -eq 0 ]; then exit 1;fi
    
    

    si $Latitude contient autre chose qu'un nombre $Comp sera vide, sinon la comparaison se fera et retournera 1 si vrai et 0 si faux

    pour le reste c'est facile

    LatDegres=${Latitude%.*}
    Minutes=`echo "0."${Latitude#*.}*60 | bc -l` 
    LatMinutes=${Minutes%.*}
    Secondes=`echo "0."${Minutes#*.}*60 | bc -l`
    LatSecondes=${Secondes%.*}
    
    

    Bon, mon codage de débutant va faire sourire ici, mais ça marche (enfin, me semble-t-il)

    Si quelqu'un veut proposer mieux…

    Au fait : bc se fout visiblement des locales

    • [^] # Re: J'ai fini par trouver

      Posté par  . Évalué à 2.

      Au fait : bc se fout visiblement des locales

      C'est clair.

      $ locale
      LANG=fr_FR.UTF-8
      LANGUAGE=
      LC_CTYPE="fr_FR.UTF-8"
      LC_NUMERIC="fr_FR.UTF-8"
      LC_TIME="fr_FR.UTF-8"
      LC_COLLATE="fr_FR.UTF-8"
      LC_MONETARY="fr_FR.UTF-8"
      LC_MESSAGES="fr_FR.UTF-8"
      LC_PAPER="fr_FR.UTF-8"
      LC_NAME="fr_FR.UTF-8"
      LC_ADDRESS="fr_FR.UTF-8"
      LC_TELEPHONE="fr_FR.UTF-8"
      LC_MEASUREMENT="fr_FR.UTF-8"
      LC_IDENTIFICATION="fr_FR.UTF-8"
      LC_ALL=
      
      
      $ bc -lq
      2*2.0
      4.0
      2*2,0
      (standard_in) 2: syntax error
      
      

      Et je pense que c'est pas plus mal.

  • # Mais pourquoi diable le shell?

    Posté par  (site web personnel) . Évalué à 1.

    Le langage de programmation du SHELL sert à décrire des procédures de haut niveau en termes de processus. Est-ce que tu as de bonnes raisons de faire ta conversion au niveau du shell? Sinon inclus cette procédure dans un programme externe écrit avec un autre langage.

    Le shell n'est résolument pas fait pour mainpuler explicitment des données: ce qu'il sait bien faire c'est faire transiter des données opaques (fichiers) d'un processus à l'autre.

    • [^] # Re: Mais pourquoi diable le shell?

      Posté par  (site web personnel) . Évalué à 2.

      Oui, sans doute, mais je ne suis pas un programmeur et j'ai la flemme d'appendre un langage qui me servirait 2 fois par an et dont j'oublierai tout d'une fois sur l'autre… J'ai essayé une fois de me mettre à perl, je ne sais même plus dire "hello world" :)

      Et puis finalement, ça ne marche pas si mal le bash, la preuve

      • [^] # Re: Mais pourquoi diable le shell?

        Posté par  (site web personnel) . Évalué à 4.

        Oui, sans doute, mais je ne suis pas un programmeur et j'ai la flemme d'appendre un langage qui me servirait 2 fois par an et dont j'oublierai tout d'une fois sur l'autre…

        C'est une assez bonne raison! :)

        J'ai essayé une fois de me mettre à perl, je ne sais même plus dire "hello world" :)

        Pour enrichir ton vocabulaire je te suggère te regarder le Perl Cookbook: il est rempli d'exemples que tu peux copier et éditer, plutôt pratique si tu n'as qu'une pratique sporadique! (Si tu spikes ingliche.)

        http://docstore.mik.ua/orelly/perl/cookbook/index.htm

        Voilà d'ailleurs un exemple de procédure Perl qui fait ce que tu veux convertDecimalToDegMinSec:

        http://jaystile.wordpress.com/2009/02/21/perl-converting-decimal-to-degrees-minutes-seconds-and-vice-versa/

        Je ne peux pas deviner à quoi ressemble ton traitement, mais si tu as une boucle où tu convertis beaucoup de ces nombresx tu as intérêt à l'écrire avec un filtre perl. De façon générale c'est toujours bien d'organiser ses programmes shell en termes de flux de données (c'est-à-dire, écrire des fonctions fonctionnant comme des filtres). Malheureusement ce n'est pas toujours hyper intuitif, mais j'ai écrit un petit exemple un peu détaillé là:

        https://linuxfr.org/forums/programmationshell/posts/le-plus-petit#comment-1383883

        • [^] # Re: Mais pourquoi diable le shell?

          Posté par  (site web personnel) . Évalué à 1.

          Pour enrichir ton vocabulaire je te suggère te regarder le Perl Cookbook: il est rempli d'exemples que tu peux copier et éditer, plutôt pratique si tu n'as qu'une pratique sporadique! (Si tu spikes ingliche.)

          Merci pour le tuyau, je vais regarder

      • [^] # Re: Mais pourquoi diable le shell?

        Posté par  (site web personnel) . Évalué à 2.

        Et puis finalement, ça ne marche pas si mal le bash, la preuve

        Le problème n'est pas tant que ça marche ou pas, mais plutôt que le shell est employé à contre nature. Le jour où tu voudras faire évoluer ton programme, tu le paieras au prix fort, parceque le shell n'est pas du tout adapté à l'écriture de programmes.

  • # Changer shell

    Posté par  . Évalué à 2.

    Bash ne gère que les entiers. Utilise zsh, qui sait gérer les flottants de manière native.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.