Como usar como argumento os caracteres +, -, x, / em um script [duplicado]

1

Estou tentando escrever um script que chamarei calc.sh, que faz cálculos básicos usando os argumentos do script ($ 1, $ 2 e $ 3). Por exemplo, eu gostaria de obter 2 como resultado para ./calc.sh 10/5

Meu começo é assim:

if [ $2 -eq "+" ] ; then res='expr $1 + $3' ; echo "$res" ; fi

Mas não funciona, eu recebo algo como: Linha 2: [+: uma expressão inteira era esperada

NOw Que eu usei == para fazer a comparação está funcionando bem para todas as operações, exceto a divisão /. O código agora é:

if [ $2 == "+" ] ; then res='expr $1 + $3' ;
elif [ $2 == "-" ] ; then res='expr $1 - $3' ;
elif [ $2 == "x" ] ; then res='expr $1 \* $3' ;
elif [ $2 == "/" ] ; then res='expr $1 \/ $3' ;
else res='Operación no válida' ;
fi ; echo "$res"

Mas se eu tentar ./calc.sh 10 / 5 , eu irei receber: "linha 4: 10/5: erro de sintaxe: operador aritmético inválido (o elemento de erro é" \ 5 ") ... Ai, como estou digitando, sou percebendo que deveria ser $ 1 / $ 3 ...
:)

    
por Lorena R 14.11.2016 / 13:12

4 respostas

1

Se você estiver usando um shell bash , tente:

if [ $2 == "+" ] ;then
 res=$(($1 + $3))
 echo $res 
fi

Editar

Altere a próxima linha (observe a substituição de ' por " ):

else res='Operación no válida' ;

Para:

else res="Operación no válida" ;

Editar 2

Em vez de usar tantas instruções if else , você pode usar uma instrução case:

case $2 in
+)
  res='expr $1 + $3'
  ;;
-)
  res='expr $1 - $3'
  ;;
/)
  res='expr $1 \/ $3'
  ;;
x)
  res='expr $1 \* $3'
  ;;
*)
  res="Operación inválida"
  ;;
esac

echo "$res"
    
por 14.11.2016 / 13:20
1

O script:

#!/bin/sh
IFS=" " # join arguments with a space character
echo "$* = $(( $* ))"

Com + , é fácil:

./calc.sh 10 + 2
10 + 2 = 12

Mas o asterisco tem que ser escapado

./calc.sh 10 \* 2
10 * 2 = 20

ou

./calc.sh 10 "*" 2
10 * 2 = 20
    
por 14.11.2016 / 14:00
0

Como o @AlexP já apontou, você está fazendo aritmética em vez de uma comparação de strings.

Também sugiro que você use colchetes duplos [[]] em vez dos únicos.

Seu código pode ser escrito como:

#!/bin/bash

if [[ $2 == "+" ]]; then
    echo $(($1+$3))
elif [[ $2 == "/" ]]; then
    echo $(($1/$3))
fi

Exemplos de execução:

./math.sh 2 + 7
9
./math.sh 7 / 2
3
    
por 14.11.2016 / 13:26
0

Nenhuma das + , - , x ou / são especiais para o shell ou o comando [ . Seu problema aqui é que:

  • -eq é para comparação numérica. Use = em vez de comparação de string
  • você esqueceu de citar suas variáveis
  • == não é um operador sh [ padrão

Então:

if [ "$2" = + ]; then
  res='expr "$1" + "$2"'
fi

Ou use um case construct:

case $2 in
  + | - | /) res='expr "$1" "$2" "$3"';;
          x) res='expr "$1" "*" "$3"';;
          *) echo >&2 invalid; exit 1;;
esac

Note que você só usaria expr se tivesse que lidar com sistemas antigos. As implementações padrão sh modernas têm expansões aritméticas internas por meio do operador $((...)) e uma melhor forma de substituição de comando com $(...) em vez de '...' .

    
por 14.11.2016 / 14:32