Estou criando um script bash simples e quero criar um menu de seleção, como este:
$./script
echo "Choose your option:"
1) Option 1
2) Option 2
3) Option 3
4) Quit
E de acordo com a escolha do usuário, quero que diferentes ações sejam executadas. Eu sou um noob de script do shell bash, procurei na web por algumas respostas, mas não tenho nada realmente concreto.
bash
command-line
scripts
Daniel Rodrigues
fonte
fonte
seq 10 | fzf
. A desvantagem é que o fzf não está instalado por padrão. Você pode encontrar o fzf aqui: github.com/junegunn/fzfRespostas:
Adicione
break
instruções sempre que precisar doselect
loop para sair. Se abreak
não for executada, aselect
instrução será repetida e o menu será exibido novamente.Na terceira opção, incluí variáveis definidas pela
select
instrução para demonstrar que você tem acesso a esses valores. Se você escolher, ele produzirá:Você pode ver que
$REPLY
contém a sequência digitada no prompt. É usado como um índice na matriz${options[@]}
como se a matriz fosse baseada em 1. A variável$opt
contém a sequência desse índice na matriz.Observe que as opções podem ser uma lista simples diretamente na
select
declaração como esta:mas você não pode colocar essa lista em uma variável escalar por causa dos espaços em uma das opções.
Você também pode usar o globbing de arquivos se escolher entre os arquivos:
fonte
break
que interrompe oselect
loop. Você pode adicionar embreak
qualquer lugar que precisar. O manual do Bash declara "Os comandos são executados após cada seleção até que um comando de interrupção seja executado, momento em que o comando de seleção é concluído"../test.sh: line 9: syntax error near unexpected token
"Opção 1" './test.sh: linha 9: `" Opção 1 ")'`PS3
é o prompt doselect
comando. É usado automaticamente e não precisa ser referenciado explicitamente.PS3
eselect
documentação.$options
nacase
declaração em vez dos valores). Eu acho que usar os valores documenta melhor a funcionalidade das seções dacase
declaração.Não é uma resposta nova por si só , mas como ainda não há resposta aceita, aqui estão algumas dicas e truques de codificação, tanto para a seleção quanto para a zenidade:
Vale a pena mencionar:
Ambos serão repetidos até que o usuário escolha explicitamente Sair (ou Cancelar para zenidade). Essa é uma boa abordagem para menus de script interativos: depois que uma opção é selecionada e a ação é executada, o menu é apresentado novamente para outra escolha. Se a escolha for feita apenas uma vez, basta usar
break
depoisesac
(a abordagem de zenidade também pode ser reduzida)Ambos
case
são baseados em índices e não em valores. Eu acho que isso é mais fácil de codificar e manterMatriz também é usada para
zenity
abordagem.A opção "Sair" não está entre as opções originais iniciais. Ele é "adicionado" quando necessário, para que sua matriz fique limpa. Afinal, "Sair" não é necessário para o zenity, o usuário pode simplesmente clicar em "Cancelar" (ou fechar a janela) para sair. Observe como os dois usam a mesma matriz intocada de opções.
PS3
eREPLY
vars não podem ser renomeados.select
está codificado para usá-los. Todas as outras variáveis no script (opt, opções, prompt, título) podem ter os nomes desejados, desde que você faça os ajustesfonte
case
estrutura para aselect
versão que você está usando para azenity
versão:case "$opt" in . . . "${options[0]}" ) . . .
(em vez de$REPLY
e os índices1
,2
e3
).$REPLY
índices e valores.Usando
dialog
, o comando ficaria assim:Colocando em um script:
fonte
TERMINAL=$(tty)
na parte superior do meu script e, em seguida, naCHOICE
definição da variável mudei2>&1 >/dev/tty
para2>&1 >$TERMINAL
evitar problemas de redirecionamento se o script foi executado em um contexto terminal diferente.--backtitle
parâmetro faz?Você pode usar este script simples para criar opções
fonte
Eu tenho mais uma opção que é uma mistura dessas respostas, mas o que torna interessante é que você só precisa pressionar uma tecla e o script continua graças à
-n
opção de leitura. Neste exemplo, estamos solicitando o desligamento, a reinicialização ou simplesmente a saída do script usandoANS
como variável e o usuário precisa apenas pressionar E, R ou S. Também defino o padrão para sair, portanto, se enter for pressionado, o script vai sair.fonte
Como isso é direcionado ao Ubuntu, você deve usar o back-end que o debconf estiver configurado para usar. Você pode descobrir o back-end do debconf com:
Se aparecer "diálogo", provavelmente usa
whiptail
oudialog
. Em Lucid éwhiptail
.Se isso falhar, use o bash "select", conforme explicado por Dennis Williamson.
fonte
fonte
$
está faltando a$opt
variável nawhile
instrução. Aif
declaração é redundante. Recuo inconsistente. Usarmenu
em alguns lugares onde deveria estar 'show_menu.
show_menu` pode ser colocado no topo do loop em vez de ser repetido em cada umcase
. Recuo inconsistente. Uso misturado de colchetes simples e duplos. Usando sequências ANSI codificadas em vez detput
. O uso de nomes var all-caps não é recomendado.FGRED
deve ser chamadobgred
. Uso de backticks em vez de$()
. Definição de função deve ser consistente e não use ...\n
nunca será executado. Talvez mais.Eu usei o Zenity, que sempre aparece no Ubuntu, funciona muito bem e tem muitos recursos. Este é um esboço de um menu possível:
fonte
Bash fancy menu
Experimente primeiro e depois visite minha página para obter uma descrição detalhada ... Não há necessidade de bibliotecas ou programas externos como diálogo ou zenidade ...
fonte
Já existe a mesma pergunta em serverfault respondida. A solução lá usa chicote .
fonte
Supondo que você queira usar um menu de script de shell simples (sem interface de usuário sofisticada), verifique o exemplo de menu em http://www.tldp.org/LDP/abs/html/testbranch.html .
fonte