J'ai ce script Bash et j'ai eu un problème à la ligne 16. Comment puis-je prendre le résultat précédent de la ligne 15 et l'ajouter à la variable de la ligne 16?
#!/bin/bash
num=0
metab=0
for ((i=1; i<=2; i++)); do
for j in `ls output-$i-*`; do
echo "$j"
metab=$(cat $j|grep EndBuffer|awk '{sum+=$2} END { print sum/120}') (line15)
num= $num + $metab (line16)
done
echo "$num"
done
Réponses:
Pour les entiers :
Utilisez l'expansion arithmétique :
$((EXPR))
Utilisation de l'
expr
utilitaire externe . Notez que cela n'est nécessaire que pour les systèmes très anciens.Pour virgule flottante :
Bash ne prend pas directement en charge cela, mais il existe quelques outils externes que vous pouvez utiliser:
Vous pouvez également utiliser la notation scientifique (par exemple,
2.5e+2
).Pièges courants :
Lorsque vous définissez une variable, vous ne pouvez pas avoir d'espaces de chaque côté de
=
, sinon cela forcera le shell à interpréter le premier mot comme le nom de l'application à exécuter (par exemple,num=
ounum
)num= 1
num =2
bc
etexpr
attendez chaque nombre et opérateur comme un argument séparé, donc les espaces sont importants. Ils ne peuvent pas traiter des arguments comme3+
+4
.num=`expr $num1+ $num2`
la source
num1
etnum2
existaient et avaient des valeurs entières?$((..))
évaluation arithmétique est exécutée en bash.expr
est exécuté comme un processus séparé, donc ça va être beaucoup plus lent. utiliser ce dernier sur les systèmes où l'évaluation arithmétique n'est pas prise en charge (sh! = bash)$((…))
est standardisé par POSIX, il devrait devenir de plus en plus rare ce quiexpr
est nécessaire.Utilisez l'
$(( ))
expansion arithmétique.Voir le chapitre 13. Expansion arithmétique pour plus d'informations.
la source
191.003 + 190
.Il y a mille et une façons de le faire. Voici une utilisation
dc
(une calculatrice de bureau à polissage inversé qui prend en charge l'arithmétique de précision illimitée):Mais si c'est trop bash-y pour vous (ou si la portabilité est importante), vous pourriez dire
Mais peut-être que vous êtes une de ces personnes qui pensent que RPN est dégueulasse et bizarre; ne t'inquiète pas!
bc
est là pour vous:Cela dit, vous pouvez apporter des améliorations indépendantes à votre script:
Comme décrit dans la FAQ Bash 022 , Bash ne prend pas en charge nativement les nombres à virgule flottante. Si vous devez additionner des nombres à virgule flottante, l'utilisation d'un outil externe (comme
bc
oudc
) est requise.Dans ce cas, la solution serait
Pour ajouter des nombres à virgule flottante éventuellement accumulés dans
num
.la source
En bash,
Notez que bash ne peut gérer que l'arithmétique des nombres entiers, donc si votre commande awk renvoie une fraction, alors vous aurez envie de la reconcevoir: voici votre code réécrit un peu pour faire tout le calcul dans awk.
la source
J'oublie toujours la syntaxe, donc je viens sur Google, mais je ne trouve jamais celle que je connais: P. C'est le plus propre pour moi et le plus fidèle à ce que j'attendais dans d'autres langues.
la source
la source
J'aime aussi beaucoup cette méthode, moins d'encombrement:
la source
Vous devez déclarer le métab comme entier et ensuite utiliser l'évaluation arithmétique
Pour plus d'informations, voir https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html#Shell-Arithmetic
la source
Une autre
POSIX
manière compatible portable de fairebash
, qui peut être définie comme une fonction.bashrc
pour tous les opérateurs arithmétiques de convenance.et il suffit de l'appeler en ligne de commande comme,
L'idée est d'utiliser le séparateur de champ d'entrée (IFS) , une variable spéciale
bash
utilisée pour le fractionnement des mots après expansion et pour diviser les lignes en mots. La fonction modifie la valeur localement pour utiliser le caractère de séparation de mots comme opérateur de somme+
.N'oubliez pas que le
IFS
est modifié localement et ne prend PAS effet sur leIFS
comportement par défaut en dehors de l'étendue de la fonction. Un extrait de laman bash
page,Le
"$(( $* ))"
représente la liste des arguments passés pour être divisés par+
et plus tard la valeur de somme est sortie à l'aide de laprintf
fonction. La fonction peut également être étendue pour ajouter de la portée à d'autres opérations arithmétiques.la source
la source
utiliser un shell intégré
let
, il est similaire à(( expr ))
source: https://www.computerhope.com/unix/bash/let.htm
la source