Arithmétique de base en sh

Arithmétique de base en sh - Shell/Batch - Programmation

Marsh Posté le 16-03-2005 à 16:01:36    

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
Reply

Marsh Posté le 16-03-2005 à 16:01:36   

Reply

Marsh Posté le 16-03-2005 à 16:02:08    

en utilisant expr ou let ?


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 16-03-2005 à 16:08:42    

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.

Reply

Marsh Posté le 16-03-2005 à 17:18:23    

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

Reply

Marsh Posté le 16-03-2005 à 21:01:11    

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
Reply

Marsh Posté le 16-03-2005 à 22:17:29    

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

Reply

Marsh Posté le 16-03-2005 à 22:23:11    

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
Reply

Marsh Posté le 17-03-2005 à 01:05:21    

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
Reply

Marsh Posté le 17-03-2005 à 07:46:01    

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
Reply

Marsh Posté le 17-03-2005 à 10:16:41    

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
Reply

Marsh Posté le 17-03-2005 à 10:16:41   

Reply

Marsh Posté le 17-03-2005 à 15:35:41    

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

Reply

Marsh Posté le 17-03-2005 à 21:24:03    

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
Reply

Marsh Posté le 17-03-2005 à 22:59:27    

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.
Reply

Marsh Posté le 18-03-2005 à 12:57:07    

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

Reply

Marsh Posté le 22-03-2005 à 22:37:56    

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.
Reply

Marsh Posté le 02-04-2005 à 09:03:18    

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

Reply

Marsh Posté le 02-04-2005 à 10:46:07    

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 ?

Reply

Marsh Posté le 02-04-2005 à 10:48:40    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed