Shell Scripting – Criando caixas de diálogo TUI com whiptail no Linux – 27

Criando caixas de diálogo com whiptail no Linux

Neste artigo aprenderemos a criar caixas de diálogo via Shell Scripting usando a ferramenta whiptail.

O whiptail é um programa que nos permite exibir diversos tipos de caixas de diálogo com questões ou mensagens aos usuários a partir de um script do shell. O whiptail utiliza a biblioteca de programação newt, a qual é escrita em linguagem C.

Os tipos de caixas de diálogo implementadas atualmente são: yes/no, inputbox, messagebox, textbox, infobox, checklist, radiolist, gauge e passwordbox.

Usaremos um arquivo de script chamado caixas.sh para nossos testes. Crie-o com o editor vi (ou outro de sua preferência) e não se esqueça de dar permissão de execução após terminar de editá-lo e salvá-lo:

# chmod 755 caixas.sh
1. Vamos começar criando uma Caixa de Mensagem (Message Box). Podemos criar um message box que contenha uma mensagem qualquer e um botão de confirmação usando a sintaxe a seguir:
whiptail –title “<título do message box>” –msgbox “<texto que será exibido>” <altura> <largura>

Exemplos:

#!/bin/bash
whiptail --title "Caixa de Mensagem de Teste" --msgbox "Criando uma caixa de mensagem usando o whiptail. Escolha OK para continuar." --fb 10 50

 A opção –fb permite o uso de botões completos (por padrão, o whiptail usa uma versão simplificada dos botões). Testando:

# ./caixas.sh
Caixa de diálogo TUI com whiptail no Linux
 
 
2. Agora vamos criar uma caixa do tipo “Sim / Não” (Yes/No).
Sintaxe:
whiptail –title “<título da caixa de diálogo>” –yesno “<texto que será exibido>” <altura> <largura>

 Exemplo:

#!/bin/bash
if whiptail --title "Testando a caixa Yes/No" --yesno "Escolha entre as alternativas Yes e No." 10 50
then
   echo "Você escolheu Yes. O status de saída é $?."
else
   echo "Você escolheu No. O status de saída é  $?."
fi
Dialog Box com whiptal
 
3. Trabalhando com o tamanho da caixa exibida:
#!/bin/bash
{
  for ((i=0 ; i<=70 ; i+=10)); do
     whiptail --title “Caixa de Teste” --msgbox “Testando o tamanho da caixa de texto. A largura atual é $i. Pressione OK para prosseguir.” 20 $1
   done
}

4. Exibindo o conteúdo de um arquivo dentro de uma caixa do tipo textbox, com rolagem de tela (scroll):
Exemplo:

#!/bin/bash
whiptail --title “Caixa textbox” --textbox /etc/passwd 20 65 --scrolltext
 
5. Personalizando o texto dos botões da caixa Yes / No. Para isso usaremos as opções “-yes-button” e “–no-button”:

Exemplo:

#!/bin/bash
if whiptail --title "Escolhendo o tipo de instalação" --yes-button "Completa" --no-button "Personalizada"  --yesno "Escolha o tipo de instalação desejada" --fb 10 50
then
   echo "Você escolheu a instalação Completa."
else
   echo "Você escolheu a instalação Personalizada."
fi
 
6. Trabalhando com entrada de texto do usuário: Input Box:
Sintaxe:
whiptail –title “<título do input box>” –inputbox “<texto que será exibido>” <altura> <largura> <texto padrão>

Exemplo:

#!/bin/bash
nome=$(whiptail --title "Entrada de nome do usuário" --inputbox "Digite seu nome:" --fb 10 60 3>&1 1>&2 2>&3)
statussaida=$?
if [ $statussaida = 0 ]; then
   echo "O nome digitado foi: $nome"
else
   echo "Entrada cancelada pelo usuário."
fi
 
7. Criando uma caixa de senhas:
Sintaxe:
whiptail –title “<título da caixa de senha>” –passwordbox “<texto que será exibido>” altura> <largura>
 
Exemplo:
#!/bin/bash
senha=$(whiptail --title "Caixa de Senha" --passwordbox "Digite sua senha e escolha OK para continuar." --fb 10 50 3>&1 1>&2 2>&3)
status=$?
if [ $status = 0 ]; then
   echo "A senha digitada foi: $senha"
else
   echo "Entrada cancelada."
fi
 
8. Criando uma caixa de menu. Com uma caixa de menu podemos pedir para o usuário selecionar um item dentre uma lista de itens.
Sintaxe:
whiptail –title “<título da caixa de menu>” –menu “<texto a ser exibido>” <altura> <largura> <altura da caixa de menu> [ <tag> <item> ]  [ <tag> <item> ] [ <tag> <item> ]. . .

Exemplo:

#!/bin/bash
item=$(whiptail --title "Abrindo aplicativos" --menu "Escolha uma opção na lista abaixo" --fb 15 50 4 \
"1" "Calculadora" \
"2" "Efetuar Backup" \
"3" "Navegar na Internet" \
"4" "Enviar email"  3>&1 1>&2 2>&3)
 
status=$?
if [ $status = 0 ]; then
   echo "Você escolheu a opção:" $item
else
   echo "Opção cancelada."
fi
 
9. Criando uma radiolist  para que um usuário possa escolher um único item entre uma lista de itens. Com uma radiolist é possível especificar um item selecionado por padrão:
Sintaxe:
whiptail –title “<título da lista>” –radiolist “<texto a ser exibido>” <altura> <largura> <altura da lista> [ <tag> <item> <status> ]  [ <tag> <item> <status> ] . . .
 
Exemplo:
#!/bin/bash
cidade=$(whiptail --title "Listagem de Cidades" --radiolist \
"Qual cidade deseja visitar?" 15 50 5 \
"Londres" "Inglaterra" ON \
"Berlim" "Alemanha" OFF \
"Toronto" "Canadá" OFF \
"Abu Dhabi" "Emirados Árabes" OFF \
"Pequim" "China" OFF 3>&1 1>&2 2>&3)

status=$?
if [ $status = 0 ]
then
   echo "A cidade escolhida foi:" $cidade
else
   echo "Você não escolheu nenhuma cidade."
fi
 
10. Criando uma caixa de diálogo Checklist. Com uma checklist podemos mais de uma opção dentre uma lista de opções, diferentemente da radiolist, que só permite a escolha de uma opção.
Sintaxe:
whiptail –title “<título da checklist>” –checklist “<texto a ser exibido>” <altura> <largura> <altura da checklist> [ <tag> <item> <status> ]  [ <tag> <item> <status> ] . . .
 
Exemplo:
#!/bin/bash
cidade=$(whiptail --title "Listagem de Cidades" --checklist --fb \
"Quais cidades deseja visitar?" 15 50 5 \
"Londres" "Inglaterra" ON \
"Berlim" "Alemanha" OFF \
"Toronto" "Canadá" OFF \
"Abu Dhabi" "Emirados Árabes" OFF \
"Pequim" "China" OFF 3>&1 1>&2 2>&3)

status=$?
if [ $status = 0 ]
then
   echo "As cidades escolhidas foram: " $cidade
else
   echo "Você não escolheu nenhuma cidade."
fi
 
11. Vamos trabalhar agora com caixas de diálogo sequenciais, onde o conteúdo de uma caixa de diálogo dependerá do que for selecionado na caixa anterior a ela:
Exemplo:
#!/bin/bash
pais=$(whiptail --title "Listagem de Países" --radiolist --fb \
"Qual país deseja visitar?" 15 50 5 \
"1" "Inglaterra" ON \
"2" "Alemanha" OFF 3>&1 1>&2 2>&3)

status=$?

if [ $status = 0 ]
then
 if [ $pais = 1 ]
 then
   cidade=$(whiptail --title "Cidades na inglaterra" --radiolist --fb \
   "Escolha a cidade na Inglaterra:" 15 50 5 \
   "Londres" "" ON \
   "Essex" "" OFF \
   "Liverpool" "" OFF 3>&1 1>&2 2>&3)
   status=$?
   if [ $status = 0 ]
    then
        echo “A cidade escolhida foi: “ &cidade
   else
        echo “Opção cancelada pelo usuário”
   fi
else
   cidade=$(whiptail --title "Cidades na Alemanha" --radiolist --fb \
   "Escolha a cidade na Alemanha:" 15 50 5 \
   "Berlim" "" ON \
   "Frankfurt" "" OFF \
   "Dresden" "" OFF 3>&1 1>&2 2>&3)
   status=$?
   if [ $status = 0 ]
    then
        echo “A cidade escolhida foi: “ &cidade
   else
        echo “Opção cancelada pelo usuário”
   fi
fi
else
 “Nenhum país selecionado. Entrada cancelada”
fi

Assista também ao vídeo da Bóson Treinamentos que fala sobre whiptail:

Em nosso próximo artigo sobre Shell Scripting, aprenderemos a criar as caixas de diálogo usando uma outra ferramenta muito versátil, chamada de dialog, que utiliza a biblioteca ncurses.

 

Sobre Fábio dos Reis (1194 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.
Contato: Website

1 Comentário em Shell Scripting – Criando caixas de diálogo TUI com whiptail no Linux – 27

  1. Paulo Ricardo Nunes Pecke // 04/11/2016 em 15:52 // Responder

    Boa tarde professor,

    Você pode me explicar por gentileza como funcionada estas FD (Descritores de arquivos).

    echo 1234567890 > arquivo
    exec 3 arquivo
    read -n 4 &3
    exec 3>&-

    cat arquivo

    Não entendi porque em alguns casos específicos eles são utilizados. Se já existem os convencionais que suprem a maioria das necessidades. (>, >>, <, <,&>, |)

    Em um dos seus vídeos também ví aqui estes registradores:

    #!/bin/bash
    nome=$(whiptail –title “Entrada de nome do usuário” –inputbox “Digite seu nome:” –fb 10 60 3>&1 1>&2 2>&3)
    statussaida=$?
    if [ $statussaida = 0 ]; then
    echo “O nome digitado foi: $nome”
    else
    echo “Entrada cancelada pelo usuário.”
    fi

    Agradeço se puderem me ajudar.

    Abraço.

Escreva um comentário

Seu e-mail não será divulgado


*