Operações aritméticas com expr e variáveis

4

Por que essa declaração não funciona?

total='expr $mPercent / 100 "*" .482 + $fPercent / 100 "*" .518'

mPercent é um número como resultado de uma instrução awk, assim como fPercent. Eu também recebo "expr: argumento não numérico" como uma mensagem de erro.

NOTA: Para os propósitos de sua pergunta, digamos que as duas variáveis tenham o valor 3,27.

    
por swam 31.10.2014 / 06:08

3 respostas

2

bash não pode fazer operações de ponto flutuante, apenas inteiros. Sugiro usar bc -l :

$ mPercent='2.72'
$ fPercent='3.14'
$ bc -l <<< $(echo "$mPercent / 100 "*" .482 + $fPercent / 100 "*" .518")
.02937560000000000000
    
por 31.10.2014 / 06:33
2

O comando expr só pode fazer manipulações inteiras ou de string. Veja a man page para esta orientação:

Operands are either integers or strings. Integers consist of one or more decimal digits, with an optional leading '-'. 'expr' converts anything appearing in an operand position to an integer or a string depending on the operation being applied to it.

Portanto, para executar esse tipo de operação, você precisará inscrever um caluclator de linha de comando, como bc .

Exemplo

$ mPercent='.123'
$ fPercent='.345'
$ echo "$mPercent / 100 * .482 + $fPercent / 100 * .518" | bc -l
.00237996000000000000

NOTA: expr não faz parte do Bash, é um executável independente que faz parte do pacote coreutils. Em sistemas que usam RPMs, você pode ver isto da seguinte forma:

$ rpm -qf $(type -p /usr/bin/expr)
coreutils-8.21-13.fc19.x86_64

Usar seus dados fornecidos nos comentários de 3,27 para as 2 variáveis gera o seguinte:

$ mPercent='3.27'
$ fPercent='3.27'
$ echo "$mPercent / 100 * .482 + $fPercent / 100 * .518" | bc -l
.03270000000000000000
    
por 31.10.2014 / 06:38
1

Minha sugestão é que use bc para operação aritmética e <<< (aqui String) para introduzir os valores em bc .

$ mPercent=3.27
$ fPercent=3.27

$ bc -l <<< "$mPercent / 100 * .482 + $fPercent / 100 * .518"
.03270000000000000000

Aqui, a opção -l para bc permitirá que você use a aritmética de ponto flutuante com mais funções matemáticas.

    
por 31.10.2014 / 07:26