“expressão inteira esperada”

3

Estou executando o seguinte script:

#!/bin/bash
# This script acts as a simple calculator for add, subtract, multiply and divide.
echo "Kindly ENTER 'a' to select for addition"
echo "Kindly ENTER 's' to select for subtraction"
echo "Kindly ENTER 'm' to select for multiplication"
echo "Kindly ENTER 'd' to select for division"
read oper
echo "Please ENTER any number of your choice"
read no1
echo "Please ENTER another number of your choice"
read no2
if [ $oper -eq a ]; then 
echo "Your addition result is: $(($no1 + $no2))" 
elif [ $oper -eq s ]; then 
echo "Your subtraction result is: $(($no1 - $no2))"
elif [ $oper -eq m ]; then 
echo "Your multiplication result is: $(($no1 * $no2))"
elif [ $oper -eq d ]; then 
echo "Your division result is: $(($no1 / $no2))"
else echo "Your selection from the begining was incorrect"
fi

Este é o erro / saída:

./test2.sh: line 12: [: m: integer expression expected
./test2.sh: line 13: [: m: integer expression expected
./test2.sh: line 14: [: m: integer expression expected
./test2.sh: line 15: [: m: integer expression expected
Your selection from the begining was incorrect

Qual poderia ser a causa, por favor?

    
por Sparks026 08.06.2018 / 19:06

4 respostas

5

O operador -eq é um operador relacional que é específico para valores inteiros. Esses operadores não funcionam para valores de string, a menos que seu valor seja inteiro.

Portanto, use = , que verifica se o valor de dois operandos de string é igual ou não

    
por 08.06.2018 / 19:46
4

Como outros afirmaram, -eq é um operador de comparação que se aplica apenas a números inteiros. O utilitário shell test tem várias operandos para diferentes propósitos. Pode ser útil entender melhor todos eles.

File test operators

  • -b - Verdadeiro se o arquivo for um arquivo especial de bloco
  • -c - Verdadeiro se o arquivo for um arquivo especial de caractere
  • -d - Verdadeiro se o arquivo for um diretório
  • -e - Verdadeiro se o arquivo existir
  • -f - Verdadeiro se o arquivo for um "arquivo regular"
  • -g - Verdadeiro se o arquivo tiver um conjunto de bits SGID
  • -h - Verdadeiro se o arquivo é um link simbólico
  • -L - Verdadeiro se o arquivo é um link simbólico
  • -p - Verdadeiro se o arquivo for FIFO
  • -r - Verdadeiro se você tiver acesso de leitura ao arquivo
  • -S - Verdadeiro se o arquivo for um soquete
  • -s - Verdadeiro se o tamanho do arquivo for maior que 0
  • -u - Verdadeiro se o arquivo tiver setuid flag set
  • -w - Verdadeiro se você tiver acesso de gravação ao arquivo
  • -x - Verdadeiro se você tiver permissões de execução para arquivar

String operators (Will work with integers but will treat them as strings)

  • = - Verdadeiro se a string da esquerda for igual à da da direita
  • != - Verdadeiro se a string da esquerda não for igual à da da mão direita
  • -z - Verdadeiro se o comprimento da string for zero
  • -n - Verdadeiro se o comprimento da string for diferente de zero
  • string - Verdadeiro se a cadeia existir

Relational operators (Will not work with strings)

  • -eq - Verdadeiro se o inteiro da esquerda for igual ao inteiro da direita
  • -ne - Verdadeiro se o inteiro da esquerda não for igual ao inteiro da mão direita
  • -gt - Verdadeiro se o inteiro da esquerda for maior que o inteiro da direita
  • -ge - Verdadeiro se o inteiro da esquerda for maior ou igual ao inteiro da direita
  • -lt - Verdadeiro se o inteiro à esquerda for menor que o inteiro à direita
  • -le - Verdadeiro se o inteiro da esquerda for menor ou igual ao inteiro da direita

Boolean operators

  • ! - Verdadeiro se a expressão for falsa
  • -o - Verdadeiro se a expressão da esquerda ou a da direita forem verdadeiras
  • -a - Verdadeiro se a expressão à esquerda e a expressão à direita forem verdadeiras

Arithmetic operators (Within shell arithmetic expansion or expr)

  • + - Adiciona valores em ambos os lados do operador
  • - - Subtrai o inteiro direito do inteiro esquerdo
  • * - Multiplica valores em ambos os lados do operador
  • / - Divide o inteiro da mão esquerda do inteiro da mão direita
  • % - Divide o inteiro da mão esquerda do inteiro da direita e retorna o restante
  • = - Atribui a mão direita para a esquerda
  • == - Verdadeiro se ambos os inteiros são iguais
  • != - Verdadeiro se ambos os inteiros não forem iguais

Other

  • -t - Verdadeiro se o descritor de arquivos estiver aberto e associado a um terminal
por 08.06.2018 / 20:26
3

Para fins educacionais, uma maneira alternativa de codificar a calculadora. Sinta-se à vontade para fazer perguntas.

#!/bin/bash
declare -A operations=([addition]=+ [subtraction]=- [multiplication]='*' [division]=/)
PS3="Which calculation do you want? "
select ans in "${!operations[@]}" quit; do
    [[ $ans == quit ]] && break
    [[ -z $ans ]] && continue
    read -p "Enter two numbers separated by a space: " -r a b x
    echo "Your $ans result is: $(( a ${operations[$ans]} b ))"
done
  1. PS3 é a variável bash usada para o prompt select . É melhor que echo, porque select irá repetir a solicitação quantas vezes forem necessárias - por exemplo, se você inserir uma resposta inválida.
  2. o '*' é citado para impedir que ele se expanda em uma lista de nomes de arquivos. Consulte expansão do nome de arquivo no manual do bash. Em retrospecto, isso pode não ser necessário, não posso encontrar rapidamente uma declaração definitiva no manual. Em geral, com bash, quando incerto, adicionar cotações é geralmente o caminho certo a seguir.
por 11.06.2018 / 15:41
1

Como escreveu @steeldriver, use = em vez de -eq .

    
por 08.06.2018 / 19:18