Os scripts em sua maioria são desenvolvidos para receber argumentos via
linha de comando durante sua chamada e que determinam o comportamento do
mesmo por todo o processo. Porém, em alguns casos é necessário que o
usuário especifique qual ação ou opção é mais adequada para uma
determinada tarefa no atual momento e é através do menu textual que
essas opções são apresentadas, criando uma interação programa/usuário.
Vou apresentar duas abordagens para criação de menu textuais e quão práticos podem ser.
1. while + case + read
Aplica um loop infinito para manter a exibição constante das opções, enquanto o comando read lê o primeiro caractere digitado que posteriormente é verificado pelo case que executa o bloco equivalente a opção selecionada.
#!/bin/bash # Loop infinito. while :; do # limpa a tela clear # Menu echo ===== DATA/HORA ===== echo echo '1) Exibir hora.' echo '2) Exibir data.' echo '3) Sair.' # Lê somente o primeiro caractere digitado. read -n1 -p 'Opção: ' opc echo # Verifica o valor armazenado em 'opc' e # executa o bloco referente. case $opc in 1) printf 'Hora: %(%H:%M:%S)T\n';; 2) printf 'Data: %(%d/%m/%Y)T\n';; 3) break;; # Interrompe o loop e finaliza a exibição do menu. *) echo 'OPÇÃO INVÁLIDA !!' esac read -p 'Pressione qualquer tecla para voltar...' done echo 'Saindo...'
O select (builtin) é um comando especifico para esse tarefa e já
acompanha rotinas que substitui algumas das implementações anteriores,
entre as quais está o controle de loop para manter o menu ativo e a
leitura e atribuição automática da opção selecionada.
#!/bin/bash # Inicializa um array com as opções do menu. opcoes=('Exibir hora.' 'Exibir data.' 'Sair.') # limpa a tela clear # Menu echo ===== DATA/HORA ===== echo # Lista os elementos contidos em 'opcoes'. select opc in "${opcoes[@]}"; do # Verifica o valor armazenado em 'opc' e # executa o bloco referente. # Fica armazenado em cada vetor em 'opc' o texto literal da opção e é # através do qual é feito a validação. # # Exemplo: # ${opcoes[0]} = Exibir hora. # ${opcoes[1]} = Exibir data. # ${opcoes[2]} = Sair. # case $opc in ${opcoes[0]}) printf 'Hora: %(%H:%M:%S)T\n';; ${opcoes[1]}) printf 'Data: %(%d/%m/%Y)T\n';; ${opcoes[2]}) break;; # Finaliza o select. *) echo 'OPÇÃO INVÁLIDA !!' esac read -p 'Pressione qualquer tecla para voltar...' done echo 'Saindo...'
Fonte: http://shellscriptx.blogspot.com/2018/04/criando-menu-textual.html