Bash : Faire un calcul de résultat de variables

Bonjour,
Je vous embête encore, mais j’ai besoin de votre aide.
Je prépare un script bash et j’ai un calcul à faire dont les valeurs proviennent de variable.

#!/bin/bash 
#Calcul espace disque utilisé 
use_size=`(df -h | grep "/$"|awk '{print $3}')`
#Suppresion du dernier caractère
use_size=${use_size%?} 
allocat_size=10
img_size=`($use_size + (($use_size × $allocat_size) ÷ 100))`
echo $img_size

Et quand je joue ce script j’ai évidement une erreur.

/home/pi/Documents/test.sh: command substitution: ligne 6: erreur de syntaxe près du symbole inattendu « ( »
/home/pi/Documents/test.sh: command substitution: ligne 6: `(use_size + ((use_size × allocat_size) ÷ 100))'

Merci pour votre aide :wink:

Salut,

#!/bin/bash 
#Calcul espace disque utilisé 
use_size=`(df -h | grep "/$"|awk '{print $3}')`
#Suppression du dernier caractère
use_size=${use_size%?} 
allocat_size=10
img_size=`($use_size+$use_size*$allocat_size/100)`
echo $img_size

Ne génère plus les mêmes erreurs.
Revoir les formules de calculs :wink:

Bonne nuit :smiley:

hello,

#!/bin/bash

#Calcul espace disque utilisé 
use_size=`df -h | grep "/$"|awk '{print $3}'`
#Suppresion du dernier caractère
use_size=${use_size%?} 
allocat_size=10
echo "scale=2; $use_size + (($use_size * $allocat_size) / 100)" | bc
d=$(echo "scale=2; $use_size + (($use_size * $allocat_size) / 100)" | bc)
echo $d

je vois pas bien à quoi sert ton calcul :roll_eyes: mais avec cette syntaxe soit t’affiche directement le résultat soit tu le récupères dans une variable .
et en bonus les parenthèse changent l’ordre du calcul …
mais c’est quant même un langage un peu « space » … :upside_down_face:

Bonjour,

L’erreur provient de l’utilisation des doubles parenthèse en bash elles ont une autre signification.

https://abs.traduc.org/abs-5.3-fr/ch09s07.html

Autre soucis que je rencontre, la valeur $use_size contient une virgule que la commande ne sait pas interpréter !

A+

hello,

@bof : Alors pour tout dire, je prépare un script bash pour faire un backup à chaud.
Dans cette partie j’ajoute 10% d’espace au back up.
Il faut aussi voir, pour ma part, que ce script me sert d’apprentissage.
Par contre je ne comprend pas pourquoi il faut mettre un echo dans la variable ?

@jelopo : Je me doutais bien que la virgule serais un pb.
Je vais donc utiliser les Octets a la place de Go

Je me répond avec un article sur les commandes mathématiques de Bash que je viens de trouver sur ABS traduc

je crois que ça vient d’une sordide histoire de pointeur… en gros ( en très gros :wink: ) suivant la syntaxe:

  • soit tu stockes en mémoire la chaîne de caractères correspondant à l’opération !
  • soit avec la syntaxe avec des parenthèses partout, tu vas chercher le contenu de chaque variable en mémoire et tu stockes le résultat de l’opération dans une variable.
  • soit avec la syntaxe avec echo, tu mets dans la variable la valeur qu"afficherait l’echo. ( en fait c’est « echo » qui doit se charger de faire tout le buziness que fait la syntaxe avec des parenthèses.)

en partant du principe que plus c’est simple, mieux c’est ! la syntaxe avec l’echo me paraît la meilleure !
( en informatiue, faut savoir être feignant :wink: )

en 1989 ( date de création de bash ) on faisait gaffe à la taille des programmes et au temps d’exécution avec des processeurs cadencés en Mhz et la ram en Ko valait mieux ! d’où l’intérêt de ne pas utiliser une routine gourmande comme pouvait l’être echo, mais maintenant avec les CPU en Ghz et la ram en Go on s’en fout !

source : https://www.rocq.inria.fr/secret/Anne.Canteaut/COURS_C/chapitre3.html

Une solution qui est lisible pour toute personne ayant des notions de programmation et qui, ce qui ne gâte rien, consomme un seul tube (au lieu de 3 ) fait appel uniquement à awk, une fois les octets comptés par un df tout bête (non lisible par un hêtre humain, son resultat étant traité … par une machine)

                         3030800      484284     2389232  17% /
[briond@sotrtm34-sidev ~]$ df | awk '{ if ((NF >=3) && ("/" == $NF)){
  usedSize=$3;
  allocatedExtra=10;
  imgSize=  usedSize * (100  + allocatedExtra) + 50 ;
  printf("%ld\n", imgSize / 100);
}}'
2628155 # la valeur trouvée, arrondie au plus proche entier (d'où l'addition de 50)

C’est moins exotique que les verrues successives ajoutées à bash pour pouvoir faire de l’arithmetique et on peut se relire/être relu par d’autres dans 3 mois, sans compétences exceptionnelles…
ensuite, la sortie peut être récupérée (comme pour echo … mais vous le savez déjà)

Il n’y a pas a dire c’est beau :smiley:
Juste une question, comment je fait pour récupérer la valeur de imgSize plus loin dans mon script ?
Et comment afficher cette valeur en Gio sur 2 décimale (imgSize / 1000^2) ?

Je me répond sur la partie décimale.
Il faut formater ainsi : %.2f

En tout cas merci

C’est le même format qu’en python(IIRC) ou en C…
awk est très populaire, car, au prix d’une charge RAM un peu accrue (un tube et invoqué par bash), il est lisible par … ceux qui lisent C ou python (bash ne l’est pas: merci pour vos liens: des fois, bash est incontournable et vos liens sont parfaits pour remédier à cette imperfection)

vous mettez ce script entre « inverted quotes » (AltGR 7 sur un clavier français) comme pour (testé)

sortieEcho=echo 5
echo $sortieEcho

Devant la complexité pour rentrer des commandes ou des lignes de code … qui en font voir de toutes les couleurs… je ne peux pas rentrer dans les détails, malheureusement… mais c’est très simple (testez sur votre terminal : awk fonctionne comme echo: sort sur stdout qui peut devenir une variable bsh par l’antiquote)