como posso adicionar (subtrair, etc.) dois números com 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 depois todos minhas tentativas de adicionar os números falham:

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

Execute:

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 recebendo strings quando tento adicionar add (“2 + 2” em vez de “4”).

Comentários

  • Editei seu título porque esta é uma boa pergunta geral e, se você restringisse o contexto, perceberia que isso não tem nada a ver com case ou qualquer coisa, exceto uma linha: echo $num+$num, uma vez que irá reproduzir o problema exatamente . A ideia de minimizar o contexto em questões de programação é explicado aqui: sscce.org
  • +1 Oi goldilocks, sim isso ficou claro para mim depois, mas sim, tudo Você concorda com sua linha de raciocínio e sim, quanto mais específica e ' singular ' uma pergunta é melhor. Congratulo-me com sua (s) edição (ões) 🙂 Obrigado 🙂

Resposta

A 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))" 

Também existe expr:

expr $num1 + $num2 

No script $(()) é preferível, pois evita bifurcação / execução do comando expr.

Comentários

  • Ou mesmo diretamente echo $(($num1$op$num2)) sem envolver case.
  • Há ' s não case envolvido aqui.
  • Não, mas você usou + literal, então precisará do case fora para lidar com a subtração separadamente.
  • @manatwork: You mea n elimine o case do código ' s com echo $(($num1$op$num2)) – isso funcionará , mas usar o case é mais robusto, pois você pode lidar com erros com um * padrão.
  • +1 para vocês dois. Eu estava usando o caso (pode não ter mostrado no início), mas como vocês dois perceberam, o problema não era ' sobre o caso.

Resposta

A resposta existente é bash puro, então será mais rápido do que isso, mas só pode lidar com inteiros. Se precisar lidar com flutuações, você deve usar o programa externo bc.

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

O scale=4 diz a bc para usar quatro casas decimais. Consulte man bc para obter mais informações.

Comentários

  • Observe que enquanto bash não ' t suporta aritmética de ponto flutuante com $((...)), muitos shells (ksh93, zsh, yash pelo menos) fazem. A vantagem de bc é que ele suporta precisão arbitrária, enquanto a aritmética shell é limitada ao processador ' s double tipo. Observe que você não ' não precisa definir scale aqui. Para adições, o parâmetro scale não é usado. A escala de 3.1415+9.99 será derivada daquela dos operandos (aqui 4).
  • Como fazer as contas se um valor for 450 e o outro é decimal armazenado em uma variável $mynumber? Por exemplo, 450-$mynumber.
  • @sigur echo "450-$mynumber" | bc deve fazer isso. Se você quiser que uma variável se expanda, você deve usar aspas duplas em vez de aspas simples.
  • @evilsoup, agora funciona perfeitamente. Obrigado.
  • computedval=$(echo 'scale=10;var1-var2' | bc) não ' não funciona, nem computedval=$(echo 'scale=10;$var1-$var2' | bc)

Resposta

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

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

Resposta

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

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

Comentários

  • expr não é necessário e ' nunca necessário capturar a saída padrão de um comando apenas para gravá-lo de volta na saída padrão.

Resposta

minimalista

total=0 ((total+=qty)) 

Resposta

Com base na sequência de entradas que você solicitou do usuário , parece que você está usando a notação polonesa reversa.

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, já que é para isso que serve.

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

E xample 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 $ 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *