Por que deixar o comando não funcionar para adicionar números reais?

3

Eu preciso adicionar alguns números reais em um script. Eu tentei:

let var=2.5+2.5 

que me dá erro - operador aritmético inválido e tentei:

let var=2,5+2,5 

que não me dá erro, mas me dá um resultado errado - 2 neste caso.

Por quê? Como adicionar números reais usando let ou outro comando?

    
por user263207 29.03.2014 / 09:33

3 respostas

6

A primeira variante ( let var=2.5+2.5 ) não funciona porque o bash não suporta ponto flutuante.

A segunda variante ( let var=2,5+2,5 ) funciona, mas pode não ser o que você deseja porque a vírgula tem outro significado neste caso: é um separador, separador de comando. Então, seu comando é equivalente nesse caso com os três comandos a seguir:

let var=2
let 5+2
let 5

que são todos válidos e, por isso, você obtém var=2 .

Mas a boa notícia é que você pode usar bc para realizar o que deseja. Por exemplo:

var=$(bc <<< "2.5+2.5")

Ou awk :

var=$(awk "BEGIN {print 2.5+2.5; exit}")

Ou perl :

var=$(perl -e "print 2.5+2.5")

Ou python :

var=$(python -c "print 2.5+2.5")
    
por Radu Rădeanu 29.03.2014 / 09:44
4

Bash não lida com aritmética de ponto flutuante.

Se você realmente precisa de aritmética de FP, use bc ou dc . Por exemplo,

var=$(bc <<< "2.5+2.5")
echo "$var"

produzirá 5.0 , ou com dc (muita diversão, é a notação de polimento inverso):

var=$(dc <<< "2.5 2.5 + p")
echo "$var"

também produzirá 5.0 .

    
por gniourf_gniourf 29.03.2014 / 09:44
2

zsh é outro shell diferente do bash que permite o ponto flutuante no shell. Se você usar zsh em vez de bash, que suporta let usando pontos flutuantes, não será necessário modificar o script. Basta instalá-lo usando sudo apt-get install zsh e depois usá-lo em seu script com o shebang #!/usr/bin/zsh ou usando o shell. Demonstração:

➜  ~  let var=2.5+2.5                      
➜  ~  echo $var
5.0000000000

O script deve funcionar bem, já que o zsh implementou todas as funções que o bash tem e muito mais. Seu segundo exemplo não funcionará porque a vírgula (,) é interpretada pelos shells como separador. Diz para executar o comando let com var=2 5+2 e 2 .

    
por Braiam 29.03.2014 / 18:12