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
shaolin
fonte

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")
gniourf_gniourf
fonte
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
9

A substituição de comando armazena a saída de um comando em uma variável.

var3=$(echo "scale=2;$var1/$var2" | bc)
Gilles 'SO- parar de ser mau'
fonte
Obrigado! Isso me levou exatamente onde eu queria estar, depois de provavelmente uma hora de pesquisa. Obrigado
shaolin