Suponho que você realmente quer algo assim:
check_update () {
echo "Checking update"
}
reinstall_theme () {
echo "Reinstalling theme"
}
while true; do
options=("Check for update" "Reinstall theme")
echo "Choose an option:"
select opt in "${options[@]}"; do
case $REPLY in
1) check_update; break ;;
2) reinstall_theme; break ;;
*) echo "What's that?" >&2
esac
done
echo "Doing other things..."
echo "Are we done?"
select opt in "Yes" "No"; do
case $REPLY in
1) break 2 ;;
2) break ;;
*) echo "Look, it's a simple question..." >&2
esac
done
done
Eu separei as tarefas em função separada para manter a primeira instrução case
menor. Eu também usei $REPLY
em vez da string de opção nas instruções case
, pois isso é mais curto e não quebrará se você decidir alterá-las, mas esqueça de atualizá-las nos dois locais. Também estou optando por não tocar em PS3
, pois isso pode afetar mais tarde select
chamadas no script. Se eu quisesse um prompt diferente, eu o definiria uma vez e o deixaria (talvez PS3="Your choice: "
). Isso daria a um script com várias perguntas uma sensação mais uniforme.
Eu adicionei um loop externo que itera tudo até que o usuário termine. Você precisa desse loop para exibir novamente a pergunta na primeira instrução select
.
Eu adicionei break
às declarações case
, caso contrário, não há como sair além de interromper o script.
O propósito de um select
é obter uma resposta para uma pergunta do usuário, não para ser realmente o loop de evento principal de um script (por si só). Em geral, um select
- case
deve realmente definir apenas uma variável ou chamar uma função e, em seguida, continuar.
Uma versão mais curta que incorpora uma opção "Quit" no primeiro select
:
check_update () {
echo "Checking update"
}
reinstall_theme () {
echo "Reinstalling theme"
}
while true; do
options=("Check for update" "Reinstall theme" "Quit")
echo "Choose an option: "
select opt in "${options[@]}"; do
case $REPLY in
1) check_update; break ;;
2) reinstall_theme; break ;;
3) break 2 ;;
*) echo "What's that?" >&2
esac
done
done
echo "Bye bye!"