De qualquer forma, para passar uma variável para bc, ter um comando para ser executado?

3

Eu preciso passar determinada variável para bc para obter a saída em ponto flutuante,

var1=$((<some operation>))
var2=$((<some operation>))      #Needs var1
var3=$((<some operation>))      #Needs var2
bc -l <<< $var3                 #Need output in Floating points

Saída:

(standard_in) 1: illegal character: $

De qualquer forma, para superar isso?

Atualização:

diff=$(($epoc2-$epoc1))
var1=$(($diff / 60))
var2=$(($var1 / 57))
var3='bc <<< 'scale=2; $var2''
    
por Keyshov Borate 16.04.2015 / 08:51

4 respostas

3

As aspas simples não expandem a variável $ . Você tem que usar aspas duplas:

var3='bc <<< "scale=2; $var2"'

Por outro lado, $var1 e $var2 não armazenam float ( bash não os gerencia), então bc .

diff=$(($epoc2-$epoc1))
var1=$(bc <<< "scale=3 ; $diff / 60")
var2=$(bc <<< "scale=3 ; $var1 / 57")
var3=$(bc <<< "scale=2; $var2")
    
por 16.04.2015 / 09:23
2

A expressão não é expandida devido ao único ticks ' .

Use algo como:

var3=$(bc <<< "scale=2; $var2")
    
por 16.04.2015 / 09:23
2

A mensagem de erro significa que você tem um sinal de dólar literal em sua entrada para bc . No shell, aspas simples preservam o valor literal de cada caractere. Use as aspas duplas para interpolar as variáveis:

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

Isso provavelmente não obterá a saída desejada, porque bc geralmente não trunca ou preenche os valores de entrada. Você pode enganá-lo usando uma divisão sem operação:

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

Isso reforçará a escala de 2dp na saída.

No entanto, seria mais simples (e provavelmente mais preciso) fazer tudo na calculadora - ambos var1 e var2 terão os resultados da divisão de números inteiros em Bash e POSIX sh.

var3='bc <<< "scale = 2 ; $diff / 60 / 57"'

Isto dará a resposta matematicamente correta, apropriadamente arredondada. Se você quiser um comportamento inteiro e bc de escalonamento por algum motivo, você pode usar a outra versão.

    
por 16.04.2015 / 09:24
2

Se seus cálculos de bc estiverem um pouco envolvidos, você também pode usar os documentos AQUI para torná-lo mais legível:

var2=500
bc << EOF
scale=2
$var2 + 100
EOF

imprime

600
    
por 16.04.2015 / 09:33