bash - Como posso reexibir o menu de seleção depois que uma seleção é escolhida e executada

3

Eu sou um iniciante no script. Eu estou fazendo um script de ferramenta para o meu tema com 2 funções: Verifique a atualização, reinstale o tema

Então aqui está o código para o menu de seleção:

PS3='Choose an option: '
options=("Check for update" "Reinstall theme")
select opt in "${options[@]}"
do
     case $opt in
             "Check for update")
                       echo "Checking update"
                               ;;
             "Reinstall theme")
                       echo "Reinstalling"
                               ;;
                               *) echo invalid option;;
     esac
done

Ao executá-lo, aparece assim

1) Check for update
2) Reinstall theme
Choose an option:

eu digito 1 e entro, o comando check for update é executado

O problema é quando ele termina de executar o script, ele exibe novamente "Escolha uma opção:" não com o menu. Por isso, pode dificultar a escolha dos usuários sem o menu (especialmente após um longo script)

1) Check for update
2) Reinstall theme
Choose an option: 1
Checking update
Choose an option:

Então, como posso exibir novamente o menu depois que uma opção é executada

    
por superquanganh 01.07.2016 / 18:39

2 respostas

5

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!"
    
por 02.07.2016 / 09:52
1

Seu loop é infinito e sua instrução select está fora dele. O script executa a instrução select uma vez e depois permanece no loop fazendo a verificação do caso $ opt over e over. Minha recomendação seria colocar break após sua declaração de caso assim:

esac
break
done

Em seguida, se você realmente quiser que o script inteiro se repita várias vezes, crie outro loop que inclua tudo, desde a instrução select até a instrução done.

    
por 01.07.2016 / 19:57

Tags