Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3159 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Arithmétique de base en sh

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Arithmétique de base en sh

n°1014781
el muchach​o
Comfortably Numb
Posté le 16-03-2005 à 16:01:36  profilanswer
 

J'ai le malheur de devoir en faire. ;)
 
Donc mon problème est très simple : j'ai une variable $a, je veux pouvoir faire le calcul $a * 60, sans avoir à faire un fork à la noix, et si possible, seulement avec le sh de base.
 
Genre, un :
$a=20
echo "$a * 60"
> 1200
et non :
> 20 * 60
 
Actuellement, je fais  
echo "$a * 60" | bc
ce qui, pour une pauvre multiplication, est un peu lourd. [:itm] (nb : c'est le seul moyen que je connaisse pour du calcul sur des flottants en sh)
Je sais qu'on peut le faire avec une syntaxe un peu spéciale, :
@ DUMMY=$a * 60
echo $DUMMY
unset DUMMY
 
C'est mieux, mais ça nécessite une variable intermédiaire.
Question : y'a-t'il moyen de se passer de cette variable intermédiaire ?


Message édité par el muchacho le 16-03-2005 à 16:07:03
mood
Publicité
Posté le 16-03-2005 à 16:01:36  profilanswer
 

n°1014783
black_lord
Truth speaks from peacefulness
Posté le 16-03-2005 à 16:02:08  profilanswer
 

en utilisant expr ou let ?


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°1014802
el muchach​o
Comfortably Numb
Posté le 16-03-2005 à 16:08:42  profilanswer
 

black_lord a écrit :

en utilisant expr ou let ?


 
expr fait un fork il me semble (ce n'est pas un mot-clé de sh), et let, c'est du bash et je suis +/- obligé de me limiter au sh de base.

n°1014903
couak
Posté le 16-03-2005 à 17:18:23  profilanswer
 

Code :
  1. echo $(($a * 60))

n°1015204
el muchach​o
Comfortably Numb
Posté le 16-03-2005 à 21:01:11  profilanswer
 

D'après un message lu précédemment ici, c'est du bash, ça. Oui, je pourrais changer le #!/bin/sh en #!/bin/bash, mais chez nous, on préfère rester compatible avec les outils moisis d'il y a 25 ans.


Message édité par el muchacho le 16-03-2005 à 21:05:15
n°1015337
couak
Posté le 16-03-2005 à 22:17:29  profilanswer
 

HFR n'est pas la seule ressource de la planète :o  
http://www.rt.com/man/sh.1.html
 
Pour être plus précis :

Arithmetic expansion provides a mechanism for evaluating an arithmetic expression and substituting its value. The format for arithmetic expansion is as follows: $((expression))


 
Un conseil : utilises un ksh c'est plus puissant et tu es aussi sûr d'avoir un KSH sur un Unix que d'avoir un VI
Le produit sur lequel je bosse est utilisé sur la plupart des Unix (même des tout pourris) et partout où je passé j'ai toujours tout fait en KSH sans aucun soucis

n°1015343
couak
Posté le 16-03-2005 à 22:23:11  profilanswer
 

le meilleur shebang-line de la terre :

Code :
  1. #!/usr/bin/perl

le reste c'est nul :ange:


Message édité par couak le 16-03-2005 à 22:23:44
n°1015520
SBAM
Best recording of rach 3.
Posté le 17-03-2005 à 01:05:21  profilanswer
 

couak a écrit :

le meilleur shebang-line de la terre : #!/usr/bin/ruby le reste c'est nul :ange:


Message édité par SBAM le 17-03-2005 à 01:05:44
n°1015566
el muchach​o
Comfortably Numb
Posté le 17-03-2005 à 07:46:01  profilanswer
 

couak a écrit :

HFR n'est pas la seule ressource de la planète :o  
http://www.rt.com/man/sh.1.html
 
Pour être plus précis :

Arithmetic expansion provides a mechanism for evaluating an arithmetic expression and substituting its value. The format for arithmetic expansion is as follows: $((expression))


 
Un conseil : utilises un ksh c'est plus puissant et tu es aussi sûr d'avoir un KSH sur un Unix que d'avoir un VI
Le produit sur lequel je bosse est utilisé sur la plupart des Unix (même des tout pourris) et partout où je passé j'ai toujours tout fait en KSH sans aucun soucis


 
Ok, désolé, j'avais pourtant compulsé le fuckin'manual, mais ces lignes m'ont échappé.
Merci, je vais essayer. Pour ksh, je n'y compte pas trop. Mes scripts doivent être compatibles Linux et éventuellement backward compatibles Sun (quoique, honnêtement, ce prérequis me parait ridicule, la plupart des dev ne seront vraisemblablement jamais portés sur les anciennes Sun).
 
edit : à l'essai, ça n'a pas l'air de fonctionner sur Sun. J'ai l'impression que cette syntaxe a été rajoutée un peu plus tard.


Message édité par el muchacho le 17-03-2005 à 10:11:09
n°1015644
couak
Posté le 17-03-2005 à 10:16:41  profilanswer
 

ca doit être une version de sh super vieille :/ j'avais également testé sur un Solaris 8 et aucun soucis
quoique c'est ptet parce que je suis en ksh :/
 
edit : testé sur un Solaris 9

Code :
  1. $ sh
  2. $ export plop=6
  3. $ echo $(($plop * 60))
  4. 360


Message édité par couak le 17-03-2005 à 10:25:47
mood
Publicité
Posté le 17-03-2005 à 10:16:41  profilanswer
 

n°1016092
el muchach​o
Comfortably Numb
Posté le 17-03-2005 à 15:35:41  profilanswer
 

oui. Ce qui est marrant, c'est que sous Linux, $((plop * 60)) marche aussi.

n°1016600
matafan
Posté le 17-03-2005 à 21:24:03  profilanswer
 

C'est pas particulierement marrant, c'est juste que les deux ecritures ("$(($plop * 60))" et "$((plop * 60))" ) ne font pas la meme chose. Dans la premiere, $plop est interprete avant que l'expression arithmetique soit evaluee. Si $plop vaut 10, l'expression qui est evaluee est $((10 * 60)). Dans la deuxieme, plop est evalue plus tard, quand l'expression arithmetique est evaluee.
 
C'est la meme chose me direz vous ? Non : essayez les deux ecritures avec un plop non defini. La premiere fait une erreur de syntaxe, la deuxieme fait soit une erreur "propre" (ksh), soit suppose que plop est nul.
 
Enfin bref, la "bonne" ecriture c'est $(( plop * 60 )).


Message édité par matafan le 17-03-2005 à 21:26:00
n°1016768
Sve@r
Posté le 17-03-2005 à 22:59:27  profilanswer
 

matafan a écrit :

C'est pas particulierement marrant, c'est juste que les deux ecritures ("$(($plop * 60))" et "$((plop * 60))" ) ne font pas la meme chose. Dans la premiere, $plop est interprete avant que l'expression arithmetique soit evaluee. Si $plop vaut 10, l'expression qui est evaluee est $((10 * 60)). Dans la deuxieme, plop est evalue plus tard, quand l'expression arithmetique est evaluee.
 
C'est la meme chose me direz vous ? Non : essayez les deux ecritures avec un plop non defini. La premiere fait une erreur de syntaxe, la deuxieme fait soit une erreur "propre" (ksh), soit suppose que plop est nul.
 
Enfin bref, la "bonne" ecriture c'est $(( plop * 60 )).


 
Cette écriture semble déjà trop évoluée pour le shell de base de "el muchacho"
Il faut savoir que le vrai shell d'origine de Bourne ne sait pas faire de calculs. Heureusement, il existe "expr" qui sait les faire à sa place
 
Code 100% compatible Bourne Shell d'il y a 25 ans:

plop=12
plop=`expr $plop \* 60`


 
et pour pallier un risque d'avoir "plop" non défini

plop=`expr ${plop:-0} \* 60`


 
et enfin, pour être certain qu'une variable quelconque contient bien du nombre

numeric()
{
   expr $1 + 0 1>/dev/null 2>&1
   test $? -lt 2 && return 0 || return 1
}
...
...
numeric $plop && plop=`expr $plop \* 60` || echo "$plop n'est pas un nombre"


 
et voilà


Message édité par Sve@r le 17-03-2005 à 23:06:28

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1017267
el muchach​o
Comfortably Numb
Posté le 18-03-2005 à 12:57:07  profilanswer
 

Merci à tous pour ces réponses, et notamment à Sve@r dont je recommande le cours de prog shell qu'on trouve sur son site.

n°1021581
Sve@r
Posté le 22-03-2005 à 22:37:56  profilanswer
 

el muchacho a écrit :

Merci à tous pour ces réponses, et notamment à Sve@r dont je recommande le cours de prog shell qu'on trouve sur son site.


 :love:  :love:  :love:


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1033007
el muchach​o
Comfortably Numb
Posté le 02-04-2005 à 09:03:18  profilanswer
 

Par contre, ton site, il fait vraiment chier sous FireFox...

n°1033019
Sve@r
Posté le 02-04-2005 à 10:46:07  profilanswer
 

el muchacho a écrit :

Par contre, ton site, il fait vraiment chier sous FireFox...


 
ben déjà, je préfère Opera à Firefox. Mais quel est le problème réel ? L'horloge en javascript ?

n°1033021
el muchach​o
Comfortably Numb
Posté le 02-04-2005 à 10:48:40  profilanswer
 

Déjà on la voit pas sous FF mais c'est pas grave. Mais surtout, on ne voit pas ton site lui-même, seulement le frame extérieur.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Arithmétique de base en sh

 

Sujets relatifs
[Oracle] Créer une 2ème base identiqueprobleme insertion base de données
Modifier le type d'un champ sur une base de productionDelphi 7 sans la base comment s'en sortir??
[MSSQL]Problème pour requete et connexion à une base MSSQLProcédure stockée et parametre "base donnée"
Programme C++ utilisant une base de donnéeRajouté un nouveau champ facilement (dans fichier et base de donnée)
[VB.NET]Comment inserer/effacer donnees d'une base Access...[Bash] arithmétique de base : incrementer un variable :-(
Plus de sujets relatifs à : Arithmétique de base en sh


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR