Como passar resultados de bc para uma variável


15

Estou escrevendo um script e gostaria de passar os resultados bcpara uma variável. Eu declarei 2 variáveis ​​( var1e var2) e lhes dei valores. No meu script, quero passar os resultados de bcpara outra variável, digamos, var3para que eu possa trabalhar com var3outros cálculos. Até agora, consegui gravar o resultado em um arquivo que não é o que estou procurando e também consegui ecoar o resultado no terminal, mas só quero passar o resultado para uma variável no momento, para que Eu posso trabalhar com essa variável.

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

Respostas:


23

Se você estiver usando o bash, é melhor usar uma string here em vez de um pipe, como em:

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

Isso economizará um subshell.

Em seguida, para armazenar a saída de um comando, use uma substituição de comando:

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

Editar.

Se você quiser algo ainda mais legal do que o seguinte bc, aqui está o dc (calculadora de polimento reverso):

answer=$(dc <<< "2k $var1 $var2/p")

11
Sim, eu estou usando o bash, você pode esclarecer sobre o subshell? Existe uma desvantagem?
shaolin

2
Cada vez que você usa um canal, |o comando à direita do canal é executado em um subshell, e são necessários recursos para abrir um novo subshell (é como abrir uma nova instância do bash para executar esse comando). Se você pode evitá-lo, evite-o. Aqui, canalizar echopara bcexecutar o comando bcem um subshell e é, em certo sentido, retardado (sem ofensa), já que o bash tem a maravilhosa construção aqui-string <<<para evitar coisas estúpidas como essas.
gniourf_gniourf

@gniourf_gniourf Por outro lado, se você se importasse com o uso de recursos, usaria /bin/sh(dash) em vez de bash, mas o dash não possui <<<.
Gilles 'SO- stop be evil'

Obrigado pela informação útil!! É uma boa informação para saber sobre a preservação de recursos e subshells. Eu aprecio muito sua contribuição.
shaolin

11
@ Gilles basta comparar time for i in {1..10000}; do : <<< ""; donecom time for i in {1..10000}; do echo "" | : ; done, você verá uma diferença dramática. Então você está certo, um heredoc é um pouco mais rápido que um herestring. Mas é mais complicado digitar como uma linha.
gniourf_gniourf

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.