Rechercher : dans
Par :

Shell: calcul numérique sur variables

Dernière réponse le 15 oct 2009 à 17:16:11 nicnictout, le 25 sep 2009 à 18:38:26 
 Signaler ce message aux modérateurs

Bonjour,

je sais bien que le shell n'est pas vraiment optimisé pour les calculs numériques surtout sur des variables qu'il considère comme des strings. Malheureusement, je souhaite lui faire faire une simple petite multiplication entre 2 variables dynamiques off course :)

J'ai cherché et essayer a peu près toutes les commandes listées ci-dessous:
let
expr
set
calc

Voici mon programme allégé (il sert a récup l'utilisation mem d'un client et de le comparer à un seuil):

var1=/tmp/var1
var2=/tmp/var2
var3=/tmp/var3
seuil=50/100

CMD="free | grep "buffers/cache""
(ssh client $CMD) > $var1
cat $var1 | awk '{print $4}' > $var2
let var3=$var2*$seuil


Malheureusement cela ne fonctionne pas, il ne semble pas interpréter var2 comme un entier, j'ai pourtant tenté de le caster avec typeset -i var2, ou typeset -f au cas ou.

Quelqu'un pourrait il me dire comment réaliser cette multiplication svp?

D'avance merci

Configuration: Windows Vista
Safari 532.0

Meilleures réponses pour « Shell: calcul numérique sur variables » dans :
[Shell] Tester une variable numérique Voir Tester une variable numérique    Préambule Dans un environnement "shell", les variables sont, par défaut, de type "chaîne de caractères". De ce fait il n'est pas possible de déclarer une variable de type "entier" (enfin, ceci n'est pas tout à...
Le remplacement de variables en shell Bash Voir=Le remplacement de variables= Introduction Il peut s'avérer utile de s'assurer qu'une variable est bien définie avant de procéder à son remplacement, ou tout simplement de s'assurer que celle-ci n'est pas vide, et dans ce cas de l'initialiser avec...
Sed - Supprimer une ou plusieurs lignes d'un fichier VoirSupprimer une (ou plusieurs) ligne(s) d'un fichier Syntaxe sed '{[/]||[/]}d' sed '{[/][,][/]d' /.../ = délimiteurs n = le numéro de ligne chaîne = la chaîne contenue dans la...
[Bash] La variable d'environnement PATH VoirLa variable d'environnement PATH I. Préambule II. C'est quoi le shell ? III. Définition IV. Séance de dissection V. Ajouter un répertoire à la variable PATH VI. Et puis... I. Préambule Sous les systèmes GNU/Linux qu'on le veuille ou...
Le son numérique VoirQu'est-ce que le son ? Le son est une vibration de l'air, c'est-à-dire une suite de surpressions et de dépressions de l'air par rapport à une moyenne, qui est la pression atmosphérique. D'ailleurs pour s'en convaincre, il suffit de placer un...
Variables d'environnement VoirVariables d'environnement Une variable d'environnement est une valeur dynamique, chargée en mémoire, pouvant être utilisée par plusieurs processus fonctionnant simultanément. Sur la plupart des systèmes d'exploitation, les emplacement de...
Linux - Le shell VoirIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire le système...

1

spacm, le 25 sep 2009 à 19:03:23

Peut être une piste?


var1=/tmp/var1
seuil=50/100

CMD="free | grep "buffers/cache""
(ssh client $CMD) > $var1
var2=`cat $var1 | awk '{print $4}' `
var3= expr $var2 * $seuil

Répondre à spacm

2

nicnictout, le 25 sep 2009 à 20:16:54

Bonsoir,

merci de cette réponse rapide.

Je ne suis plus au boulot mais je test ta soluce des demain, une fois ma VM monté ;)

Je te tiens au courant.

Répondre à nicnictout

3

nicnictout, le 28 sep 2009 à 11:16:15

Bonjour,

il s'avère que cela ne fonctionne toujours pas. Mais je crois que le problème n'est pas lié a la syntaxe de la cmd, lorsque j'essaie de taper directement :

expr /tmp/ovo_al_fs.tmp2*0.9
/tmp/ovo_al_fs.tmp2*0.9

J'ai essayé la même comd avec let:
let /tmp/ovo_al_fs.tmp2*0.9
-bash: let: /tmp/ovo_al_fs.tmp2*0.9: syntax error: operand expected (error token is "/tmp/ovo_al_fs.tmp2*0.9")


Je crois que je vais finir par le dev en perl mon script... foutue gestion des variables :(

Répondre à nicnictout

4

nicnictout, le 28 sep 2009 à 11:41:31

Bonjour,

apparemment mon précédent post n'est pas passé.

Je n'arrive toujours pas a faire fonctionner mon script, lorsque j'utilise ta méthode j'ai les erreurs suivantes:

tmpfile3='expr $tmpfile2 * $seuil'
cat: /tmp/seuil: ne peut pas s'ouvrir [Aucun fichier ou répertoire de ce type]

Pourtant le fichier existe et il est bien accessible en lecture. J'ai essayé de remplacer la variable $seuil par sa valeur numérique directement:

tmpfile3='expr $tmpfile2 * 0,9'
Mais la encore il me dit que le fichier n'existe pas, et je sais pas comment lui dire que c'est la valeur à utiliser.

D'avance merci pour votre aide.

Répondre à nicnictout

5

nicnictout, le 28 sep 2009 à 11:43:15

Bonjour,

apparemment mon précédent post n'est pas passé.

Je n'arrive toujours pas a faire fonctionner mon script, lorsque j'utilise ta méthode j'ai les erreurs suivantes:

tmpfile3='expr $tmpfile2 * $seuil'
cat: /tmp/seuil: ne peut pas s'ouvrir [Aucun fichier ou répertoire de ce type]

Pourtant le fichier existe et il est bien accessible en lecture. J'ai essayé de remplacer la variable $seuil par sa valeur numérique directement:

tmpfile3='expr $tmpfile2 * 0,9'
Mais la encore il me dit que le fichier n'existe pas, et je sais pas comment lui dire que c'est la valeur à utiliser.

D'avance merci pour votre aide.

Répondre à nicnictout

6

jipicy, le 28 sep 2009 à 12:56:43

Salut,

 ssh$ A=$(free | grep "buffers/cache")

 ssh$ B="50 / 100"

 ssh$ echo ${A##* }
208012

 ssh$ C=$(expr ${A##* } \* $B)

 ssh$ echo $C
104006

 ssh$
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

7

 nicnictout, le 15 oct 2009 à 17:16:11

Bonjour,

j'ai trouvé la solution à mon pb.

plutôt que de faire un calcul sur des flottant, je suis passé par le prédicat suivant:

si x = 3/4y alors 4x=3y

Du coup plus de problème et tout fonctionne parfaitement.

Merci quand même.

PS: même avec ta solution le résultat de la commande ne fonctionnait pas

Répondre à nicnictout