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").
case
nada além de uma linha:echo $num+$num
pois isso reproduzirá exatamente o problema . A idéia com minimizando contexto em questões de programação é explicado aqui: sscce.orgRespostas:
A aritmética nos shells POSIX é feita com
$
e parênteses duplos(( ))
:Você pode atribuir a partir disso (sans
echo
):Há também
expr
:$(())
É preferível usar scripts, pois evita uma bifurcação / execução para oexpr
comando.fonte
echo $(($num1$op$num2))
sem envolvercase
.case
envolvido aqui.+
, portanto precisará docase
exterior para lidar com a subtração separadamente.case
código do OP comecho $(($num1$op$num2))
- isso funcionará, mas usar ocase
é mais robusto, pois você pode lidar com erros com um padrão*
.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 carros alegóricos, precisará usar o programa externo
bc
.O
scale=4
dizbc
para usar quatro casas decimais. Vejaman bc
para mais informações.fonte
bash
não suporta aritmética de ponto flutuante com$((...))
, muitas conchas (ksh93
,zsh
,yash
pelo menos) fazer. A vantagembc
é que ele suporta precisão arbitrária, enquanto a aritmética de shell é limitada aodouble
tipo de processador . Observe que você não precisa definirscale
aqui. Para adições, oscale
parâmetro não é usado. A escala de3.1415+9.99
será derivada da dos operandos (aqui 4).450
e o outro é decimal armazenado em uma variável$mynumber
? Por exemplo450-$mynumber
,.echo "450-$mynumber" | bc
deve fazê-lo. Se você deseja expandir uma variável, use aspas duplas em vez de aspas simples.computedval=$(echo 'scale=10;var1-var2' | bc)
não funciona, nem funcionacomputedval=$(echo 'scale=10;$var1-$var2' | bc)
Observe que
\
antes de*
(para multiplicação), toda a expressão deve estar entre aspas `.fonte
expr
não é necessário e nunca é necessário capturar a saída padrão de um comando apenas para gravá-lo novamente na saída padrão.minimalista
fonte
Você também pode usar a
$[ ... ]
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 nos proteger*
de tratá-lo como um padrão.fonte
Com base na sequência de entradas solicitadas ao usuário, parece que você está usando a notação de polimento reverso.
Você pode fazer melhor apenas usando
dc
(calculadora de mesa) diretamente, pois é para isso que serve.Exemplo de sessão usando
dc
:Ou, de maneira não interativa:
fonte