desenv-web-rp.com

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

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

Corre:

First number please
1
Second mumber please
2
Operation?
+

Resultado:

num1+num2

...ou...

echo $num1+$num2;;

# results in: 1+2    

...ou...

echo `$num1`+`$num2`;;

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

Parece que ainda estou conseguindo seqüências de caracteres quando tento add add ("2 + 2" em vez de "4").

106
Michael Durrant

Aritmética em shells POSIX é feita com $ E parênteses duplos (( )):

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

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

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

Há também expr:

expr $num1 + $num2

Nos scripts $(()) é preferível, pois evita uma bifurcação/execução para o comando expr.

148
goldilocks

A resposta existente é o bash puro, portanto será mais rápido que isso, mas só pode lidar com números inteiros. Se você precisar lidar com flutuadores, precisará 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. Vejo man bc Para maiores informações.

15
evilsoup
echo `expr $a + $b`   
echo `expr $a - $b`   
echo `expr $a \* $b`   
echo `expr $a / $b`   

Note o \ antes de o * (para multiplicação), toda a expressão deve estar entre aspas `.

5
Himani

Você também pode usar $[ ... ] estrutura. Nesse caso, usamos o mecanismo incorporado no Bash, que é mais rápido e um pouco mais conveniente de usar. Como sabemos que tudo entre $ [e] é tratado como uma expressão, não precisamos preceder as variáveis ​​com $. Da mesma forma, não precisamos garantir * de tratá-lo como um padrão.

num1=2
num2=3
echo $[num1 + num2]
5
3
jedi

minimalista

total=0
((total+=qty))
2
geekzspot

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

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

Você pode fazer melhor apenas usando dc (calculadora de mesa) diretamente, pois é para isso que serve.

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, de maneira não interativa:

$ dc -e '1 2 + p'
3
$
0
Wildcard