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

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

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 somar os números falham:

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

Correr:

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 ainda estou recebendo strings quando tento add add ("2+2" em vez de "4").

Responder1

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

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

Você pode atribuir a partir disso; observe também que os $operadores nos nomes das variáveis ​​internas (())são opcionais):

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

Há também expr:

expr $num1 + $num2

Em scripts $(())é preferível, pois evita uma bifurcação/execução do exprcomando.

Responder2

A resposta existente é pura bash, então será mais rápida que isso, mas só pode lidar com números inteiros. Se você precisar lidar com carros alegóricos, terá que usar o programa externo bc.

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

A scale=4instrução diz bcpara usar quatro casas decimais. Consulte man bcpara obter mais informações.

Responder3

Você também pode usar $[ ... ]estrutura. Nesse caso, usamos o mecanismo embutido 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 evitar *tratá-lo como um padrão.

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

Responder4

minimalista

total=0
((total+=qty))

informação relacionada