Postagem em destaque

Criando bot do Telegram em Shell script com ShellBot

Criando menu textual

O uso do menu em scripts, oferece ao usuário uma experiência interativa; apresentando opções predeterminadas para execução de uma função especifica sem complicações; a diferenciar do uso tradicional de parâmetros e argumentos que exige do usuário o controle sobre aquilo que esta fazendo. No final o menu dá ao script um aspecto elegante e profissional.

Vou mostrar algumas formas de construir um menu textual sem dores de cabeça.

1. Exemplo

Para montar a estrutura desse menu, vou utilizar os seguintes comandos:

Comando Qual será a sua função ?
while Manter o fluxo do programa no menu.
echo Montar as opções do menu.
case Verificar a opção selecionada.
break Finalizar o menu.
read Lê a opção digitada

O menu tem como opções o nome de três linguagens de programação, das quais o usuário deverá selecionar, onde uma ação será executada referente a opção selecionada e exibir o resultado na tela.

Script: menu1.sh


#!/bin/bash


# Limpando a tela
clear

# Loop infinito
while :
do
    # Imprimindo as opções do menu
    echo 'Selecione a linguagem que está estudando.'
    echo
    echo '1 - Java'
    echo '2 - Shell Script'
    echo '3 - C++'
    echo '4 - Sair'

    # '-p' Exibe a mensagem 'Opção' no prompt de entrada.
    # '-n1' Lê o caractere único e armazena em 'OPCAO'.
    read -n1 -p 'Opção: ' OPCAO

    # Insere uma nova linha
    echo

    # Lê o número armazenado na variável 'OPCAO' e executa a opção correspondente.
    case $OPCAO in
        1)  # Opção 1
            # Executando os comandos...
            echo "Você está estudando Java."

            # Finaliza o menu
            break
            ;;
        2)  # Opção 2Selecione a linguagem que está estudando.
1) Java
2) Shell Script
3) C++
4) Sair
#? 9
Opção seleciona é inválida.

#?

            # Executando os comandos...
            echo 'Você está estudando Shell Script.'

            # Finaliza o menu
            break
            ;;

        3)  # Opcao 3
            # Executando os comandos...
            echo 'Você está estudando C++.'

            # Finaliza o menu
            break
            ;;
        4)  # Finalizar script
            echo 'Saindo...'
            exit 0
            ;;
        *)  # Opção inválida. (nenhuma das opções anteriores).
            # O comando break não é executado para que o fluxo do script
            # permaneça preso ao menu, forçando o usuário a selecionar uma
            # opção válida.

            # Imprimindo mensagem de erro.
            echo 'Opção seleciona é inválida.'
            echo
            ;;
    esac
done

echo 'Continuando a execução...'

Vou executar o script e testar as opções do menu, selecionando a opção '2'.

$ ./menu1.sh

Selecione a linguagem que está estudando.

1 - Java
2 - Shell Script
3 - C++
4 - Sair
Opção: 2
Você está estudando Shell Script.
Continuando a execução...

Como a opção informada é valida, o script executa os comandos referente a opção imprimindo a mensagem, interrompe o loop finalizando o menu e continuando o fluxo do script.

Vou informar uma opção que não existe para ver a se mensagem de erro é exibida.


$ ./menu1.sh

Selecione a linguagem que está estudando.

1 - Java
2 - Shell Script
3 - C++
4 - Sair
Opção: 7
Opção seleciona é inválida.

Selecione a linguagem que está estudando.

1 - Java
2 - Shell Script
3 - C++
4 - Sair
Opção:

Não só a mensagem de erro foi retornada, como apresentou novamente o menu para que o usuário informasse uma opção válida. A omissão do comando break na opção '*' na estrutura do case, impede que script finalize o menu e continue a execução quando uma opção inválida é selecionada.

Selecionando a opção sair (finalizar script).

$ ./menu1.sh

Selecione a linguagem que está estudando.

1 - Java
2 - Shell Script
3 - C++
4 - Sair
Opção: 4
Saindo...

Retornou a mensagem informando ao usuário que está finalizando o script e executa o comando exit, interrompendo o processo de execução do mesmo.

2. Exemplo

Neste exemplo vou utilizar uma comando especifico para essa finalidade, que é o comando select, que seleciona palavras de uma lista e executa comandos.


select NOME [in PALAVRAS ... ;] do COMANDOS; done

Sua sintaxe é semelhante ao comando for, porém as palavras são expandidas, gerando uma lista de palavras. O conjunto de palavras é precedido de um número. Se a linha consiste do número correspondente a uma das palavras exibidas, então a variável NOME recebe aquela palavra. Se a linha for vazia, PALAVRAS e o prompt são reexibidos. Comandos são executados após cada seleção até que um comando break seja executado.

Para montar a estrutura do menu utilizei os seguintes comandos:

ComandoQual será a sua função ?
selectLê as opções do menu
breakFinaliza o menu
caseVerifica a opção selecionada.


O menu mantém as opções do exemplo anterior.

Script: menu2.sh

#!/bin/bash

clear

echo 'Selecione a linguagem que está estudando.'

# Lê as palavras expandidas, criando as opções do menu enumeradas.
select OPCAO in 'Java' 'Shell Script' 'C++' 'Sair'
do
    # Lê o número armazenado na variável 'OPCAO' e executa a opção correspondente.
    case $OPCAO in
        'Java') # Opção 1
            # Executando os comandos...
            echo "Você está estudando Java."

            # Finaliza o menu
            break
            ;;
        'Shell Script') # Opção 2
            # Executando os comandos...
            echo 'Você está estudando Shell Script.'

            # Finaliza o menu
            break
            ;;

        'C++')  # Opcao 3
            # Executando os comandos...
            echo 'Você está estudando C++.'

            # Finaliza o menu
            break
            ;;
        'Sair')  # Finalizar script
            echo 'Saindo...'
            exit 0
            ;;
        *)  # Opção inválida. (nenhuma das opções anteriores).
            # O comando break não é executado para que o fluxo do script
            # permaneça preso ao menu, forçando o usuário a selecionar uma
            # opção válida.
            # Executando os comandos..
            echo 'Opção seleciona é inválida.'
            echo
            ;;
    esac
done

echo 'Continuando a execução...'

Mesmo utilizando o comando select, o uso do case é necessário para avaliar o valor armazenado na variável. Ele cria um menu com as opções enumeradas, inserindo um prompt de entrada, para que o usuário informe a opção deseja. Quando o usuário informa o número, a variável recebe o nome da opção ao invés do número; por essa razão,os nomes são avaliados no case.

Vamos testar o script, selecionando a opção 2.

./menu2.sh
Selecione a linguagem que está estudando.
1) Java
2) Shell Script
3) C++
4) Sair
#? 2
Você está estudando Shell Script.
Continuando a execução...

O '#?' é o prompt de entrada do comando select, que lê o número da opção.
Ao informar o valor '2', a variável OPCAO recebe a expressão 'Shell Script' que por sua vez é lida e avaliada pelo case.

Escolhendo uma opção inválida.

Selecione a linguagem que está estudando.
1) Java
2) Shell Script
3) C++
4) Sair
#? 9
Opção seleciona é inválida.

#?

No caso de uma opção inválida, imprime a mensagem de erro e reexibe o prompt.

Essa foi uma simples demonstração de como criar um menu textual sem complicações. No lugar do case, você pode utilizar o 'if' para avaliar as opções; particularmente não recomendaria; porque dependendo da quantidade de itens, você teria que aninhar if's atrás de else if's e cai entre nós; isso tudo para um simples menu ?

Comentários

Contato

Nome

E-mail *

Mensagem *