Shell: calcul numérique sur variables
nicnictout
Messages postés
11
Date d'inscription
Statut
Membre
Dernière intervention
-
nicnictout Messages postés 11 Date d'inscription Statut Membre Dernière intervention -
nicnictout Messages postés 11 Date d'inscription Statut Membre Dernière intervention -
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
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
A voir également:
- Script shell calcul moyenne
- Calcul moyenne excel - Guide
- Classic shell - Télécharger - Personnalisation
- Script vidéo youtube - Guide
- Calcul km marche à pied gratuit - Télécharger - Sport
- Mas script - Accueil - Windows
6 réponses
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
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
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 :(
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 :(
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.
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.
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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$;-))
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
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
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.