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
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 envolvercase. - Há ' s não
caseenvolvido aqui. - Não, mas você usou
+literal, então precisará docasefora para lidar com a subtração separadamente. - @manatwork: You mea n elimine o
casedo código ' s comecho $(($num1$op$num2))– isso funcionará , mas usar ocaseé 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
bashnão ' t suporta aritmética de ponto flutuante com$((...)), muitos shells (ksh93,zsh,yashpelo menos) fazem. A vantagem debcé que ele suporta precisão arbitrária, enquanto a aritmética shell é limitada ao processador ' sdoubletipo. Observe que você não ' não precisa definirscaleaqui. Para adições, o parâmetroscalenão é usado. A escala de3.1415+9.99será derivada daquela dos operandos (aqui 4). - Como fazer as contas se um valor for
450e o outro é decimal armazenado em uma variável$mynumber? Por exemplo,450-$mynumber. - @sigur
echo "450-$mynumber" | bcdeve 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, nemcomputedval=$(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
-
exprnã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 $
caseou 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