Por que não é expr executar aritmética em números reais usando um script de shell?

0
a=10.5
b=11.8
c='expr $a + $b | bc'
echo $c

Após a execução, ele exibe uma mensagem de erro como non-integer argument . Por que isso não está realizando aritmética usando expr ?

    
por Achal 25.03.2016 / 03:11

2 respostas

2

Explicação de erros

O erro é o mesmo que se você inserisse:

$ expr 10.5 + 11.8
expr: non-integer argument

Expr está reclamando que você deu a ele não inteiros. Isso ocorre porque o programa expr não foi projetado para cálculos não inteiros:

Expr invocação :

% bl0ck_qu0te%
  • expr foi gerado como erro padrão, seu terminal apenas exibe
  • Mas quando você usa o canal | , o canal só transfere o padrão, não o erro padrão
  • Como bc não recebeu nada com o qual trabalhar, ele não forneceu nenhuma saída, como você pode ver quando tenta enviar nada (exceto nova linha) para bc :

    $ echo | bc
    

O resultado é bc não diz nada. Então, o que você vê na tela com o comando original ainda era apenas a reclamação de expr por meio de erro padrão.

Recomendação

Para cálculos decimais, você pode usar apenas bc e alguns meios para obter entrada para bc , como com here-strings:

$ bc <<< '10.5 + 11.8'
22.3

Ou, para usar variáveis:

$ a=10.5
$ b=11.8
$ c=$(bc <<< "$a + $b")
$ echo $c
22.3
  • O $( e ) é uma substituição de comando
  • <<< string é uma sintaxe here-string, envia o conteúdo da string para stdin, que bc recebe
por clarity123 25.03.2016 / 03:21
1

info coreutils 'expr invocation' diz:

16.4 'expr': Evaluate expressions
=================================

'expr' evaluates an expression and writes the result on standard
output.  Each token of the expression must be a separate argument.

   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.

No entanto, você pode usar bc :

$ a=10.5 b=11.8 c=$(echo "scale=1;$a + $b" | bc -q );echo $c
22.3
    
por waltinator 25.03.2016 / 03:18