Comment passer les résultats de BC à une variable

15

J'écris un script et je voudrais passer les résultats de bcdans une variable. J'ai déclaré 2 variables ( var1et var2) et leur ai donné des valeurs. Dans mon script, je veux passer les résultats de bcdans une autre variable dire var3afin que je puisse travailler avec var3pour d'autres calculs. Jusqu'à présent, j'ai pu écrire le résultat dans un fichier qui n'est pas ce que je recherche et j'ai également pu faire écho du résultat dans le terminal, mais je veux simplement passer le résultat à une variable à l'instant pour que Je peux travailler avec cette variable.

echo "scale=2;$var1/var2" | bc
shaolin
la source

Réponses:

23

Si vous utilisez bash, vous feriez mieux d'utiliser une chaîne ici au lieu d'un tuyau comme dans:

bc <<< "scale=2;$var1/$var2"

Cela vous fera économiser un sous-shell.

Ensuite, pour stocker la sortie d'une commande, utilisez une substitution de commande:

answer=$(bc <<< "scale=2;$var1/$var2")

Éditer.

Si vous voulez quelque chose d'encore plus cool bc, voici dc (calculatrice de polissage inversé):

answer=$(dc <<< "2k $var1 $var2/p")
gniourf_gniourf
la source
1
Oui, j'utilise bash, pouvez-vous clarifier le sous-shell? Y a-t-il un inconvénient?
shaolin
2
Chaque fois que vous utilisez un canal, |la commande à droite du canal est exécutée dans un sous-shell, et cela prend des ressources pour ouvrir un nouveau sous-shell (c'est comme ouvrir une nouvelle instance de bash pour exécuter cette commande). Si vous pouvez l'éviter, évitez-le. Ici, canaliser un echoto bcexécutera la commande bcdans un sous-shell et est, dans un certain sens, retardé (aucune infraction), car bash a la merveilleuse construction here-string <<<pour éviter des choses stupides comme celles-ci.
gniourf_gniourf
@gniourf_gniourf Là encore, si vous vous souciez de l'utilisation des ressources, vous utiliseriez /bin/sh(tiret) au lieu de bash, mais ce n'est pas le cas pour dash <<<.
Gilles 'SO- arrête d'être méchant'
Merci pour cette information utile!! Ce sont de bonnes informations à connaître concernant la préservation des ressources et des sous-coquilles. J'apprécie grandement votre contribution.
shaolin
1
@Gilles compare time for i in {1..10000}; do : <<< ""; doneavec time for i in {1..10000}; do echo "" | : ; done, vous verrez une différence dramatique. Alors vous avez raison, un hérédoc est légèrement plus rapide qu'un héritage. Mais il est plus gênant de taper sur une ligne.
gniourf_gniourf
9

La substitution de commandes stocke la sortie d'une commande dans une variable.

var3=$(echo "scale=2;$var1/$var2" | bc)
Gilles 'SO- arrête d'être méchant'
la source
Je vous remercie! Cela m'a amené exactement où je voulais être, après probablement une heure de recherche. Merci
shaolin