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.
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
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.
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
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.