Here is how I will do this:
No, clear won't affect your input!
#!/bin/sh
number=-1
while true; do
clear
echo "------ M E N U ------"
echo "1 - Primeira opção"
echo "2 - Segunda opção"
echo "3 - Terceira opção"
echo "0 - Sair"
while true; do
printf 'Opção: '
read -r number
case $number in
''|*[!0-9]* )
echo "Input '$number' is not a number."
;;
* )
break
;;
esac
done
case $number in
0 | 1 | 2 | 3 ) break ;;
esac
echo "Input $number is not in menu!"
sleep 1.5 # time to read previous message before next `clear`.
done
echo "Você escolheu a opção $number"
case for testing input is a number, from: How do I test if a variable is a number?case for main exit before it's a lot simpler and efficient than if .. elif ... fi.sleep at end of loop, in order to permit user to read message before clear will be executed.dialog or equivalentsFrom How do I prompt for Yes/No/Cancel input in a Linux shell script?
#!/bin/sh
number="$(
dialog --menu 'Menu' 20 60 6 1 "Primeira opção" 2 "Segunda opção" \
3 "Terceira opção" 0 "Sair" 2>&1 >/dev/tty
)"
echo "Você escolheu a opção $number"
fzfOr using recent fzf utility:
#!/bin/sh
number="$(
printf '0 - Sair\n3 - Terceira opção\n2 - Segunda opção\n1 - Primeira opção'|
fzf)"
echo "Você escolheu a opção ${number%% *}"