como eu posso adicionar (subtrair, etc.) dois números com bash?

72

Eu posso ler os números e a operação com:

echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op

mas todas as minhas tentativas de adicionar os números falham:

case "$op" in
  "+")
    echo num1+num2;;
  "-")
    echo 'num1-num2';;
esac

Executar:

First number please
1
Second mumber please
2
Operation?
+

Saída:

num1+num2

... ou ...

echo $num1+$num2;;

# results in: 1+2    

... ou ...

echo '$num1'+'$num2';;

# results in: ...line 9: 1: command not found

Parece que estou recebendo strings ainda quando tento adicionar add ("2 + 2" em vez de "4").

    
por Michael Durrant 30.09.2013 / 18:33

5 respostas

92

Aritmética em shells POSIX é feita com $ e parênteses duplos:

echo "$(($num1+$num2))"

Você pode atribuir a partir desse (sans echo ):

num1="$(($num1+$num2))"

Há também expr :

expr $num1 + $num2

No script $(()) é preferível, pois evita um fork / execute para o comando expr .

    
por 30.09.2013 / 18:35
12

A resposta existente é pura bash, então será mais rápida que isso, mas só pode manipular inteiros. Se você precisa manipular floats, você tem que usar o programa externo bc .

$ echo 'scale=4;3.1415+9.99' | bc
13.1315

O scale=4 informa bc para usar quatro casas decimais. Veja man bc para mais informações.

    
por 30.09.2013 / 19:21
4
echo 'expr $a + $b'   
echo 'expr $a - $b'   
echo 'expr $a \* $b'   
echo 'expr $a / $b'   

Observe o \ antes do * (para multiplicação), a expressão inteira tem que estar dentro dos backquotes '.

    
por 01.11.2015 / 16:38
0

minimalista

total=0
((total+=qty))
    
por 05.11.2015 / 06:21
0

Com base na sequência de entradas solicitadas pelo usuário, parece que você está usando a notação de polimento inverso .

echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op

Você pode fazer melhor apenas para usar dc (calculadora de mesa) diretamente, já que é para isso.

DESCRIPTION
       Dc is a reverse-polish desk calculator which supports unlimited pre-
       cision arithmetic.

Exemplo de sessão usando dc :

$ dc
1 2 + p    # This part is typed; the result comes next.
3
q  # This is also typed.
$

Ou não interativamente:

$ dc -e '1 2 + p'
3
$
    
por 16.01.2018 / 01:01