Você pode extrair o tratamento de opções para uma função:
handleOption() {
local opt=
case "$opt" in
"Option 1")
echo "you chose choice 1"
;;
"Option 2")
echo "you chose choice 2"
;;
"Option 3")
echo "you chose choice 3"
;;
"Quit")
return 1
;;
*) echo invalid option;;
esac
}
E o menu para outra função:
menu() {
local PS3='Please enter your choice: '
select opt in "${options[@]}"
do
handleOption "$opt" || break
done
}
Em seguida, implemente a validação do primeiro argumento de linha de comando:
- É um inteiro?
- Se for um inteiro, está dentro do intervalo
1..${#options[@]}
? - Se as duas opções acima forem verdadeiras, chame o
handleOption
diretamente com o valor apropriado daoptions
array
Algo parecido com isto:
arg=
if [[ $arg =~ ^[0-9]+$ ]] && (( 1 <= arg )) && (( arg <= ${#options[@]} )); then
opt=${options[arg - 1]}
handleOption "$opt"
elif [ "$arg" ]; then
echo "warning: invalid option: $arg"
menu
else
menu
fi