Sou iniciante no bash, mas gostaria de criar um script no qual gostaria de permitir que o usuário selecione várias opções em uma lista de opções.
Basicamente, o que eu gostaria é algo semelhante ao exemplo abaixo:
#!/bin/bash
OPTIONS="Hello Quit"
select opt in $OPTIONS; do
if [ "$opt" = "Quit" ]; then
echo done
exit
elif [ "$opt" = "Hello" ]; then
echo Hello World
else
clear
echo bad option
fi
done
(Originário de http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html#ss9.1 )
No entanto, meu script teria mais opções e gostaria de permitir a seleção de múltiplos. Então, algo como isto:
1) Opção 1
2) Opção 2
3) Opção 3
4) Opção 4
5) Concluído
Ter feedback sobre os que eles selecionaram também seria ótimo, por exemplo, sinais de adição ao lado dos que eles já selecionaram. Por exemplo, se você selecionar "1", gostaria de paginar para limpar e reimprimir:
1) Option 1 +
2) Option 2
3) Option 3
4) Option 4
5) Done
Então, se você selecionar "3":
1) Option 1 +
2) Option 2
3) Option 3 +
4) Option 4
5) Done
Além disso, se eles selecionarem novamente (1), eu gostaria que "desselecione" a opção:
1) Option 1
2) Option 2
3) Option 3 +
4) Option 4
5) Done
E, finalmente, quando Concluído é pressionado, gostaria que uma lista daqueles que foram selecionados fossem exibidos antes da saída do programa, por exemplo, se o estado atual for:
1) Option 1
2) Option 2 +
3) Option 3 +
4) Option 4 +
5) Done
Pressionar 5 deve imprimir:
Option 2, Option 3, Option 4
... e o script termina.
Então, minha pergunta - isso é possível no bash, e se alguém é capaz de fornecer um exemplo de código?
Qualquer conselho seria muito apreciado.
Se você acha que
whiptail
é complexo, aqui está um código apenas do bash que faz exatamente o que você deseja. É curto (~ 20 linhas), mas um pouco enigmático para um iniciante. Além de mostrar "+" para as opções marcadas, também fornece feedback para cada ação do usuário ("opção inválida", "opção X foi marcada" / desmarcada, etc).Dito isto, lá vai você!
Espero que gostem ... foi um desafio muito divertido fazê-lo :)
fonte
while menu && read -rp "$prompt" nums && [[ "$nums" ]]; do while read num; do ... done < <(echo $nums |sed "s/ /\n/g") done
git bash
no Windows!Aqui está uma maneira de fazer exatamente o que você deseja, usando apenas os recursos do Bash sem dependências externas. Ele marca as seleções atuais e permite alterná-las.
Para ksh, altere as duas primeiras linhas da função:
e o shebang para
#!/bin/ksh
.fonte
options=(*)
(ou outros padrões de globbing) fornecerão uma lista de arquivos na matriz. O desafio seria obter o conjunto de marcas de seleção (${opts[@]}
) compactado junto com ele. Isso pode ser feito com umfor
loop, mas precisaria ser executado para cada passagem pelowhile
loop externo . Você pode considerar o usodialog
ouwhiptail
como mencionei na minha outra resposta - embora sejam dependências externas.${opts[@]}
e salvar a string, passada como um argumento adicional para a função, em vez de+
).Eu escrevi uma biblioteca chamada questionário , que é um mini-DSL para criar questionários de linha de comando. Ele solicita que o usuário responda a uma série de perguntas e imprime as respostas no stdout.
Isso torna sua tarefa muito fácil. Instale-o
pip install questionnaire
e crie um script, por exemploquestions.py
, assim:Então corra
python questions.py
. Quando terminar de responder às perguntas, elas serão impressas em stdout. Funciona com o Python 2 e 3, um dos quais quase certamente está instalado no seu sistema.Ele também pode lidar com questionários muito mais complicados, caso alguém queira fazer isso. Aqui estão alguns recursos:
fonte
Usei o exemplo do MestreLion e elaborei o código abaixo. Tudo que você precisa fazer é atualizar as opções e ações nas duas primeiras seções.
fonte
n1 SELECTION
é a parte fundamental para aumentar o número de dígitos ..-n2 SELECTION
aceitará dois dígitos (por exemplo, 15),-n3
aceita três (por exemplo, 153) etc.)Aqui está uma função bash que permite ao usuário selecionar várias opções com as teclas de seta e espaço e confirmar com Enter. Tem uma sensação agradável de menu. Eu escrevi com a ajuda de /unix//a/415155 . Pode ser chamado assim:
O resultado é armazenado como uma matriz em uma variável com o nome fornecido como o primeiro argumento. O último argumento é opcional e é usado para fazer algumas opções selecionadas por padrão. Se parece com isso.
fonte
Como não encontrei nenhum alternativo BASH adequado para o prompt-toolkit (python), dialoguer (rust) ou inquiridor (nó), tentei:
https://i.stack.imgur.com/6AyAI.png
https://asciinema.org/a/Y4hLxnN20JtAlrn3hsC6dCRn8 https://gist.github.com/blurayne/f63c5a8521c0eeab8e9afd8baa45c65e
fonte
fonte
easybashgui
.