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))'
je vois pas bien à quoi sert ton calcul 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 » …
@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 crois que ça vient d’une sordide histoire de pointeur… en gros ( en très gros ) 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 )
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 !
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
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
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)