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
case
envolvido aqui. - Não, mas você usou
+
literal, então precisará docase
fora para lidar com a subtração separadamente. - @manatwork: You mea n elimine o
case
do 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
bash
não ' t suporta aritmética de ponto flutuante com$((...))
, muitos shells (ksh93
,zsh
,yash
pelo menos) fazem. A vantagem debc
é que ele suporta precisão arbitrária, enquanto a aritmética shell é limitada ao processador ' sdouble
tipo. Observe que você não ' não precisa definirscale
aqui. Para adições, o parâmetroscale
não é usado. A escala de3.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, 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
-
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 $
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