Arithmétique de base en sh - Shell/Batch - Programmation
Marsh Posté le 16-03-2005 à 16:02:08
en utilisant expr ou let ?
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.
Marsh Posté le 16-03-2005 à 22:17:29
HFR n'est pas la seule ressource de la planète
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
Marsh Posté le 16-03-2005 à 22:23:11
le meilleur shebang-line de la terre :
Code :
|
le reste c'est nul
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 |
Marsh Posté le 17-03-2005 à 07:46:01
couak a écrit : HFR n'est pas la seule ressource de la planète
|
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.
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 :
|
Marsh Posté le 17-03-2005 à 15:35:41
oui. Ce qui est marrant, c'est que sous Linux, $((plop * 60)) marche aussi.
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 )).
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. |
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 |
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() |
et voilà
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.
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. |
Marsh Posté le 02-04-2005 à 09:03:18
Par contre, ton site, il fait vraiment chier sous FireFox...
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 ?
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.
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. (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