Erro com if… elif statemets no script de shell do linux

2
#!/bin/bash
echo "enter your choice :"
echo "1 Addition"
echo "2 subtract"
echo "3 Multiplication"
read er
echo "enter the first number : "
read a
echo "enter the second number : "
read b
if [ $er="1" ]
then
sum='expr $a + $b'
echo "sum of two numbers is $sum"
elif [ $er="2" ]
then
sub='expr $a - $b'
echo "the diff of two numbers is $sub"
exit 0
elif [ $er="3" ]
then
mult='expr $a * $b'
echo "the div of two numbers is $mult"
exit 0
else
echo "invalid choice"
fi

Este é um script simples para calculadora. Mas ele é executado somente até a primeira instrução if para adição depois disso, ele não executa a instrução elif mesmo se as condições forem verdadeiras para multiplicação e subtração.

    
por sysadmincrispy 05.10.2017 / 07:19

1 resposta

4

Você precisará de um espaço em torno do = nos testes, o $er=1 (por exemplo) não será interpretado como uma comparação corretamente.

if [ "$er" = "1" ]           # or:  if [ "$er" -eq 1 ]
then
sum='expr "$a" + "$b"'       # or:  sum=$( expr "$a" + "$b" )  or: sum=$(( a + b ))
echo "sum of two numbers is $sum"
elif [ etc...

Observe também as citações das expansões variáveis. Posteriormente no código, você também precisará citar o * em mult='expr $a * $b' para que não seja interpretado como um padrão de globalização de nomes de arquivo.

Você pode substituir cada expr por um equivalente $(( ... )) (expansão aritmética). O expr caiu em desuso nas últimas décadas.

Backticks para substituições de comandos também são desencorajados. A sintaxe $( ... ) é melhor de várias maneiras. Por exemplo, nidifica melhor:

result=$( echo $( echo a ) $( echo b ) )  # pretty much impossible with backticks

... e as citações também funcionam melhor, pois as citações dentro e fora do $( ... ) não interferem umas nas outras.

Veja também:

Você se beneficiaria usando case ... esac neste código:

case "$er" in
    1) result=$(( a + b )); op='sum'        ;;
    2) result=$(( a - b )); op='difference' ;;
    3) result=$(( a * b )); op='product'    ;;
    *) printf 'Invalid choice: "%s"?\n' "$er" >&2
       exit 1
esac

printf 'The %s of %s and %s is %s\n' "$op" "$a" "$b" "$result"
    
por 05.10.2017 / 07:46