Cómo pasar resultados de bc a una variable

15

Estoy escribiendo un script y me gustaría pasar los resultados bca una variable. He declarado 2 variables ( var1y var2) y les he dado valores. En mi script, quiero pasar los resultados de bcotra variable, por ejemplo, var3para poder trabajar con var3otros cálculos. Hasta ahora he podido escribir el resultado en un archivo que no es lo que estoy buscando y también he podido repetir el resultado en el terminal, pero solo quiero pasar el resultado a una variable en este momento para que Puedo trabajar con esa variable.

echo "scale=2;$var1/var2" | bc
Shaolin
fuente

Respuestas:

23

Si usa bash, será mejor que use una cadena here en lugar de una tubería como en:

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

Esto te ahorrará una subshell.

Luego, para almacenar la salida de un comando, use una sustitución de comando:

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

Editar.

Si quieres algo aún más genial bc, aquí tienes dc (calculadora de pulido inverso):

answer=$(dc <<< "2k $var1 $var2/p")
gniourf_gniourf
fuente
1
Sí, estoy usando bash, ¿puedes aclarar en la subshell? ¿Hay alguna desventaja?
shaolin
2
Cada vez que usa una tubería, |el comando a la derecha de la tubería se ejecuta en una subshell, y se requieren recursos para abrir una nueva subshell (es como abrir una nueva instancia de bash para ejecutar ese comando). Si puedes evitarlo, evítalo. Aquí, canalizar un echoto bcejecutará el comando bcen una subshell y es, en cierto sentido, retrasado (sin ofender), ya que bash tiene la maravillosa construcción here-string <<<para evitar cosas estúpidas como estas.
gniourf_gniourf
@gniourf_gniourf Por otra parte, si te preocupara el uso de recursos, usarías /bin/sh(guión) en lugar de bash, pero el guión no tiene <<<.
Gilles 'SO- deja de ser malvado'
¡¡Gracias por la información útil!! Esta es una buena información para saber sobre la preservación de recursos y subcapas. Le agradezco mucho su aporte.
shaolin
1
@Gilles simplemente comparan time for i in {1..10000}; do : <<< ""; donecon time for i in {1..10000}; do echo "" | : ; done, verá una diferencia dramática. Entonces tienes razón, un heredoc es un poco más rápido que una herejía. Pero es más incómodo escribir como una línea.
gniourf_gniourf
9

La sustitución de comandos almacena la salida de un comando en una variable.

var3=$(echo "scale=2;$var1/$var2" | bc)
Gilles 'SO- deja de ser malvado'
fuente
¡Gracias! Esto me llevó exactamente a donde quería estar, después de probablemente una hora de investigación. Gracias
shaolin