Aprenda Linux

  • Página Inicial
  • Contato!
  • Tudo sobre Linux Parte 1!
  • Tudo sobre Linux Parte 2!
  • Tudo sobre Linux Parte 3!
  • Tudo sobre Linux Parte 4!
  • Tudo sobre Linux Parte 5!
  • Tudo sobre Linux Parte 6!
  • Shell Scripting - Parte 4

    Criando Caixas de Diáloho TUI com Whiptail no Linux

    O Whiptail é um programa que permite exibir caixas de diálogo dentro da linha de comando do Linux.

    Veja um exemplo de linha num script:

    
    whiptail --title "Caixa MessageBox" --msgbox "Criando uma Caixa de Mensagens com o Whiptail. Escolha OK para Continuar!" --fb 10 50
    
    

    Especificamos na sequência, o título e o tipo de caixa (no caso msgbox).

    Temos também a caixa yes/no, que é assim:

    
    if whiptail --title "Caixa Yes/No" --yesno "Escolha a Alternativa Yes ou No!" --fb 10 50
    then
        echo "Você escolheu yes. O status de saída é $?."
    else
        echo "Você escolheu no. O status de saída é $?."
    fi
    
    

    Podemos inclusive personalizar os botões, por exemplo:

    
    if whiptail --title "Escolhendo o Tipo de Instalação" --yes-button "Completa" --no-button "Personalizada" --yesno "Escolha o Tipo de Instalação!" --fb 10 50
    then
        echo "Você escolheu completa. O status de saída é $?."
    else
        echo "Você escolheu personalizada. O status de saída é $?."
    fi
    
    

    A caixa info é bem simples, veja o código abaixo:

    
    whiptail --title "Caixa de Informações" --infobox "Criando uma Caixa de Informações. Escolha OK para Continuar!" 10 80
    
    

    O inputbox pede um dado digitado pelo usuário, veja um exemplo:

    
    nome=$(whiptail --title "Caixa InputBox" --inputbox "Digite seu nome:" --fb 10 60 3>&1 1>&2 2>&3)
    
    statusaida=$?
    
    if [ $statusaida = 0 ]; then
        echo "O Nome digitado foi $nome."
    else
        echo "Entrada cancelada pelo usuário."
    fi
    
    

    De forma parecida, o passwordbox pede um dado que será oculto por caracteres, como os de senhas:

    
    senha=$(whiptail --title "Caixa de Senha" --passwordbox "Digite sua senha!" --fb 10 60 3>&1 1>&2 2>&3)
    
    statusaida=$?
    
    if [ $statusaida = 0 ]; then
        echo "A senha digitada foi: $senha."
    else
        echo "Entrada cancelada."
    fi
    
    

    O checklist permite selecionar itens de uma lista, clicando no espaço, veja um exemplo de uso:

    
    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 "Entrada cancelada pelo usuário!"
    fi
    
    

    PS: Use o tab para acessar os botões OK e Cancelar.

    Criando Funções em Scripts

    Quando criamos scripts mais complexos, acabamos reutilizando partes do código várias vezes, para evitar isso usamos funções dentro do shell scripting:

    A primeira forma de criar funções é usando a palavra-chave function, por exemplo:

    
    function exemplo {
        echo "Isso foi chamado por uma função!"
    }
    
    

    Podemos criar sem a palavra function, mas nesse caso devemos colocar os parênteses após o nome da função. Por exemplo:

    
    exemplo() {
        echo "Isso foi chamado por uma função!"
    }
    
    

    Para invocar a função, basta colocarmos o nome da função no script, ficando assim:

    
    exemplo() {
        echo "Isso foi chamado por uma função!"
    }
    
    exemplo
    
    

    Um exemplo mais complexo:

    
    #!/bin/bash
    
    # Função em um script do shell
    
    function mensagem {
        echo "Essa Frase será Repetida!"
    }
    
    # Chamando a função:
    
    contador=1
    
    while [ $contador -le 10 ]; do
        mensagem
    
        contador=$[$contador + 1]
    done
    
    # Outro texto, indicando o fim do script:
    
    echo "Função Executada com Sucesso!"
    
    

    Uma função pode ser colocada dentro de uma variável para ser trabalhada, veja um exemplo abaixo:

    
    #!/bin/bash
    
    # Função em um script do shell
    
    function quadrado {
        read -p "Digite um número entre 20 e 30: " numero
    
        echo $[$numero * $numero]
    }
    
    # Atribuindo o valor da função à variável do shell valor:
    
    valor=`quadrado`
    
    # Mostrando o valor:
    
    echo "O quadrado do número é $valor."
    
    

    Uma função também pode receber parâmetros, mas no caso, não colocamos nada entre parênteses, os parâmetros, como visto, são guardados nas variáveis $1, $2, $3, etc. Veja um exemplo de uso abaixo:

    
    function soma {
        echo "A soma é" $[$1 + $2]
    }
    
    soma 10 5
    
    

    E também pode retornar valores, e seu retorno irá para a variável $?, por exemplo:

    
    function valor {
        read -p "Digite um número entre 0 e 255: " num
    
        return $num
    }
    
    valor
    
    echo "O valor retornado é $?."
    
    

    O return também pode ser usado sem nada para um retorno do tipo "void", para interromper uma rotina.

    PS: Ele só retornará números entre 0 e 255 nesse caso, para simular um retorno de outros números, além de ponto-flutuante e strings, devemos fazer assim:

    
    function valor {
        read -p "Digite um número qualquer: " num
    
        echo $num
    }
    
    saida=`valor`
    
    echo "O valor retornado é $saida."
    
    

    Exemplo com parâmetro e retorno:

    
    function cubo {
        echo $[$1 * $1 * $1]
    }
     
    res=`cubo 10`
    
    echo "O cubo de 10 é $res."
    
    

    Veja um exemplo pra exibir a data atual do sistema:

    
    function datas {
        echo -n "Data: "
    
        date +%d/%m/%Y
        
        semana=("Domingo" "Segunda-feira" "Terça-feira" "Quarta-feira" "Quinta-feira" "Sexta-feira" "Sábado")
    
        ds=`date +%w`
    
        echo ${semana[$ds]}
    
        echo -n "Hora: "
    
        date +%H:%M:%S
    }
    
    datas
    
    

    Criando Caixas de Diálogo TUI com Dialog

    O dialog é um pacote utilizado pra criar aquelas caixinhas que aparecem na linha de comando ao instalar alguns programas. Isso é chamado de TUI.

    PS: Pode ser necessário instalar o dialog dando um apt-get nele.

    Esse comando usa vários parâmetros de linha de comando para determinar o tipo de widget que iremos criar. Cada widget significa cada janelinha que o dialog pode criar.

    No exemplo abaixo, criamos uma caixa de mensagens, com os parâmentros título, corpo da caixa e dimensões da mesma.

    
    dialog --title "Caixa de Mensagem" --msgbox "Caixa de Teste" 10 35
    
    

    Seguindo a mesma lógica, podemos usar o yesno:

    
    dialog --title "Caixa Yes/No" --yesno "Escolha Sim ou Não" 10 35
    
    # Retorna 0 se selecionar OK:
    
    echo $?
    
    

    E pro inputbox:

    
    nome=$(dialog --title "Caixa de Nomes" --inputbox "Digite seu nome:" 10 35 --stdout)
    
    echo $?
    
    echo "O nome digitado foi $nome."
    
    

    Com senhas:

    
    senha=$(dialog --title "Caixa de Senhas" --passwordbox "Digite sua senha:" 10 35 --stdout)
    
    echo $?
    
    echo "A senha digitada foi $senha."
    
    

    Podemos mostrar uma grande quantidade de informações com o textbox, usando um arquivo do sistema para exibir. Veja como fazer:

    
    dialog --textbox /etc/group 20 50
    
    

    O menu também é simples de entender:

    
    sistema=$(dialog --menu "Escolha o sistema: " 20 35 15 \
    1 "Linux" \
    2 "BSD" \
    3 "Solaris" \
    4 "Android" --stdout)
    
    echo $sistema
    
    

    PS: Ele retornará o número por ser o primeiro item da linha, para retornar a string, inverta, assim:

    
    sistema=$(dialog --menu "Escolha o sistema: " 20 35 15 \
    "Linux" 1 \
    "BSD" 2 \
    "Solaris" 3 \
    "Android" 4 --stdout)
    
    

    PS: O terceiro parâmetro define o tamanho da caixa interna.

    O calendar também é bem simples, veja o código:

    
    data=$(dialog --calendar "Escolha a data: " 0 0 --stdout)
    
    echo $data
    
    

    PS: Ao passar os parâmetros como 0 0 ele ajustará a caixa automaticamente. A ordem é linha e coluna.

    O infobox é bem simples, veja como fazê-lo:

    
    dialog --title "Informação" --infobox "Operação Concluída com Êxito" 5 35
    
    sleep 4; clear
    
    

    PS: Note que colocamos um sleep para ele demorar 4 segundos para encerrar o widget e depois o clear para limpar a tela.

    O radiolist permite escolhermos apenas um item usando as setas e a barra de espaço, veja como fazê-lo:

    
    itens=$(dialog --radiolist "Escolha uma cor" 15 30 4 \
    "Verde" "" OFF \
    "Azul" "" OFF \
    "Vermelho" "" OFF \
    "Amarelo" "" ON --stdout)
    
    echo $itens
    
    

    PS: O terceiro parâmetro é a quantidade de itens, e as aspas vazia é pra não ter nada além do nome das cores.

    Declaração Break - Encerrando Loops Prematuramente

    O break é utilizado para encerrar prematuramente um loop, como por exemplo um laço for ou while.

    Vamos supor esse laço for:

    
    for num in 1 2 3 4 5 6 7 8 9 10
    do
        echo "Número: $num"
    done
    
    

    Para interromper num determinado número, colocamos o break assim:

    
    for num in 1 2 3 4 5 6 7 8 9 10
    do
        if [ $num -eq 6 ]; then
            break
        fi
        
        echo "Número: $num"
    done
    
    echo "Loop finalizado!"
    
    

    Veja outro exemplo mais complexo:

    
    read -p "Digite um número entre 1 e 10: " num
    
    while [ $num -ne 0 ]; do
        if [ $num -gt 10 ]; then
            break
        fi
    
        echo "Número digitado: $num"
    
        read -p "Digite um número entre 1 e 10: " num
    done
    
    if [ $num -eq 0 ]; then
        echo "Você encerrou o programa digitando zero!"
    else
        echo "Você digitou um valor fora do intervalo. Programa finalizado."
    fi
    
    

    Temos também o continue, que interrompe a execução do laço no ponto que ele se encontra, mas continua o loop. Veja um exemplo:

    
    cont=0
    
    while [ $cont -lt 10 ]; do
        cont=$[$cont + 1]
    
        if [ $[$cont % 2] -eq 0 ]; then
            continue
        fi
    
        echo $cont
    done
    
    

    Podemos fazer um loop infinito, interrompido pelo break também, por exemplo:

    
    cont=0
    
    while true; do
        cont=$[$cont + 1]
    
        if [ $cont -gt 100 ]; then
            break
        fi
    
        echo $cont
    done
    
    

    Formatar e Exibir texto com o comando Printf

    O comando printf no Linux é uma ferramenta interna (built-in) do shell Bash e de outros como Ksh e Zsh que permite formatar e exibir uma saída de texto.

    Este comando é útil para exibir informações em um formato específico no terminal, como por exemplo tabelas e relatórios. Veja um exemplo:

    
    printf "Dia da semana: %s\nHorário: %s\n" Sábado 11:00
    
    

    A string de formato possui caracteres de quebra de linha \n e dois especificadores de formato %s, que são substituídos pelos argumentos.

    Basicamente, é a mesma coisa do printf do C, só que sem os parênteses e as vírgulas.

    Essas são algumas das máscaras aceitas em Bash:

    Máscara Significado
    %d Valor decimal (positivo ou negativo)
    %u Valor decimal sem sinal (só positivo)
    %f Valor real
    %s String

    Também é possível usar as sequências de escape, como vimos anteriormente com a \n. Outras sequências também podem ser usadas.