Unix calculator.bash tendo problemas

2

Este é um script bash que fiz para calcular números no Unix:

echo "Please enter the calculation(operation) type (+)(-)(*)(/)"
        read $opr
echo "Enter the first number"
        read $num1
echo "Enter the second number"
        read $num2
if [[ $opr = "+" ]]; then
        num=$(($num1 + $num2))
                echo "The sum is = $num"
elif [[ $opr = "-" ]]; then
        num=$(($num1 - $num2))
                echo "The sum is = $num"
elif [[ $opr = "*" ]]; then
        num=$(($num1 * $num2))
                echo "The sum is = $num"
elif [[ $opr = "/" ]]; then
        num=$(($num1 / $num2))
                echo "The sum is = $num"
fi

Ele é executado, mas gera "A soma é=" e não fornece um número. Você consegue ver qualquer coisa que esteja causando esse problema?

    
por S.Jones 13.12.2015 / 18:56

2 respostas

4

Parece que a forma atual de obter informações através do read está errada, então a matemática está sendo feita em nada, então você acaba sem resposta. Você simplesmente precisa corrigir esse aspecto e o restante do código deve funcionar.

Como ler

Um trecho do seu código postado original mostra que você estava tentando salvar o primeiro número assim:

echo "Enter the first number"
        read $num1

Em vez disso, tente usar -p para o prompt e nomeie a variável num sem cifrão. Você pode até mesmo testar o seguinte read -p ... em seu prompt de comando, assim você verá:

$ read -p "Enter the first number" num1
Enter the first number:

Agora digite 1:

$ read -p "Enter the first number" num1
Enter the first number: 1

Agora, se você for para echo $num1 , verá o valor com êxito:

$ echo $num1
1
  • -p the_prompt_text é uma maneira de incluir um prompt
  • em comparação com echo , echo acrescenta um retorno de linha no final. Mas como -p não, é uma boa ideia ter um espaço em branco extra como eu fiz, observe depois dos dois pontos : , eu tenho um espaço: "Enter the first number: " . Isto é apenas para que a entrada do usuário não apareça diretamente contra o cólon.
  • ao especificar variáveis para salvar a resposta, a sintaxe correta com leitura é não ter o $ , portanto tivemos read e, em seguida, num1

Então, com isso, você deve conseguir adaptar as read partes do seu script e isso funcionará bem.

    
por 13.12.2015 / 19:47
2

user454038 e Cyrus descreveu corretamente como resolver seu problema, mas não o que você está fazendo errado. No shell (ou pelo menos no bash) você usa $ quando você está referenciando o valor de uma variável, mas não quando você está referenciando a própria variável (ou seja, quando você está definindo o valor). Isso é confuso; na maioria (todas?) linguagens de programação normais, você usa a mesma sintaxe de qualquer maneira. Você parece entender esse conceito parcialmente; você diz

num=$(($num1 + $num2))

em vez de cometer o erro comum de dizer

$num=$(($num1 + $num2))                                                (Don't do this!)

Isso se aplica também à instrução read . Quando você diz read $opr , o $opr é expandido (isto é, substituído pelo valor atual da variável opr ) - e o valor atual da variável opr é uma string vazia. Então o comando acaba parecendo

read

E você pode esperar que isso seja um erro; na verdade, é equivalente a read REPLY . Então,

$ read $num1
17
$ echo $num1
                                                                    (Blank line output)
$ echo $REPLY
17

Este exemplo pode ilustrar melhor o mecanismo:

$ superman=clark_kent
$ read $superman
man of steel
$ echo $superman
clark_kent
$ echo $clark_kent
man of steel

Mas você não deve fazer coisas assim (especialmente o exemplo acima) porque eles são muito crípticos; leitores / mantenedores terão problemas para entender o que o código está fazendo.

TL; DR

Suas declarações read devem ser read opr , read num1 e read num2 (sem o $ s).

    
por 14.12.2015 / 01:16