Como complemento ao que @Andy já disse , observe que
[[ "$opt" = [m,M] ]]
corresponde a m
, ,
e M
. Se você quisesse corresponder apenas em m
e M
, isso seria
[[ "$opt" = [mM] ]]
Aqui, usaria uma construção padrão case
:
case $opt in
(1) commands;;
(2) commands;;
(m|M) main;;
(x|X) exit;;
(*) echo >&2 "Invalid option"; main
esac
Observe também que o comportamento de read
depende do valor atual de $IFS
. Se você quisesse ler uma linha do usuário, usaria:
IFS= read -r opt
Para ler um caractere:
IFS= read -rn1 opt
Para ler uma palavra (leia uma linha, mas ignore o espaço e as abas iniciais e qualquer outra coisa além da primeira palavra):
IFS=$' \t' read -r opt ignored
Ou para permitir que o uso inclua espaços ou guias na palavra prefixando com barra invertida:
IFS=$' \t' read opt ignored