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:
-
Têm backticks (ou seja, 'cmd ') shells in shuns foram depreciados?
-
Implicações de segurança de esquecer de citar uma variável em shells bash / POSIX
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"