De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Rubens Queiroz de Almeida
Data de Publicação: 23 de agosto de 2017
A dica de hoje é um script bash muito interessante, desenvolvido pelo Júlio Cezar Neves. É um relógio digital, que deve ser chamado passando a linha e a coluna do seu canto superior esquerdo.
A função DrawBox desenha uma caixa, mas precisa que seja passada a linha e
coluna do vértice superior esquerdo, altura (em linhas) e largura (em colunas).
Logo no início ele testa se os parâmetros estão vindo por pipe ou por passagem. Isso é raro de se ver em Shell.
Uma excelente aula de bash :-)
#!/bin/bash
# Faz um relógio digital com a hora do sistema
#+ recebendo linha inicial e coluna inicial
function DrawBox
{
# 1o. parâmetro: Linha
# 2o. parâmetro: Coluna
# 3o. parâmetro: Altura
# 4o. parâmetro: Largura
local i
local Largura=$4
printf -v Linha "%${Largura}s" ' ' # Cria $Largura espaços em $Linha
printf -v Traco "\e(0\x71\e(B" # Põe um traço semigráfico em $Traco
tput cup $1 $2; printf "\e(0\x6c\e(B" # Canto superior esquerdo
echo -n ${Linha// /$Traco} # Troca todos os espaços de $Linha por $Traco
printf "\e(0\x6b\e(B\n" # Canto superior direito
for ((i=1; i<=$3; i++)) # Construindo altura
do
tput cup $(($1+i)) $2
printf "\e(0\x78\e(B" # Barra vertical esquerda
printf %${Largura}s"\e(0\x78\e(B\n" # Barra vertical direita
done
printf -v linha "%${Largura}s" ' '
printf -v traco "\e(0\x71\e(B"
tput cup $(($1+i)) $2; printf "\e(0\x6d\e(B"
echo -n ${Linha// /$Traco} # Troca todos os espaços de $Linha por $Traco
printf "\e(0\x6a\e(B\n"
}; export -f DrawBox
function Uso
{
echo "
Uso: $0 Linha Coluna
ou
echo Linha Coluna | $0
Onde Linha e Coluna definem o vértice
superior esquerdo do relógio"
}; export -n Uso
if [[ -t 0 ]] # Testa se o dado não está em stdin
then
(($#)) || { # Testa se tem parâmetro
Uso
exit 1
}
Parms="$@"
else
Parms=$(cat -) # Seta parâmetros com conteúdo de stdin
fi
set $Parms
(( $# == 2 )) || {
Uso
exit 1
}
Num[0]='\e(0\x6c\e(B\e(0\x71\e(B\e(0\x6b\e(B^\e(0\x78\e(B \e(0\x78\e(B^\e(0\x6d\e(B\e(0\x71\e(B\e(0\x6a\e(B'
Num[1]=' \e(0\x6b\e(B ^ \e(0\x78\e(B ^ \e(0\x76\e(B '
Num[2]='\e(0\x6c\e(B\e(0\x71\e(B\e(0\x6b\e(B^\e(0\x6c\e(B\e(0\x71\e(B\e(0\x6a\e(B^\e(0\x6d\e(B\e(0\x71\e(B\e(0\x6a\e(B'
Num[3]='\e(0\x6c\e(B\e(0\x71\e(B\e(0\x6b\e(B^ \e(0\x71\e(B\e(0\x75\e(B^\e(0\x6d\e(B\e(0\x71\e(B\e(0\x6a\e(B'
Num[4]='\e(0\x77\e(B \e(0\x77\e(B^\e(0\x6d\e(B\e(0\x71\e(B\e(0\x75\e(B^ \e(0\x76\e(B'
Num[5]='\e(0\x6c\e(B\e(0\x71\e(B\e(0\x71\e(B^\e(0\x6d\e(B\e(0\x71\e(B\e(0\x6b\e(B^\e(0\x6d\e(B\e(0\x71\e(B\e(0\x6a\e(B'
Num[6]='\e(0\x6c\e(B\e(0\x71\e(B\e(0\x6b\e(B^\e(0\x74\e(B\e(0\x71\e(B\e(0\x6b\e(B^\e(0\x6d\e(B\e(0\x71\e(B\e(0\x6a\e(B'
Num[7]='\e(0\x6c\e(B\e(0\x71\e(B\e(0\x6b\e(B^ \e(0\x78\e(B^ \e(0\x76\e(B'
Num[8]='\e(0\x6c\e(B\e(0\x71\e(B\e(0\x6b\e(B^\e(0\x74\e(B\e(0\x71\e(B\e(0\x75\e(B^\e(0\x6d\e(B\e(0\x71\e(B\e(0\x6a\e(B'
Num[9]='\e(0\x6c\e(B\e(0\x71\e(B\e(0\x6b\e(B^\e(0\x6d\e(B\e(0\x71\e(B\e(0\x75\e(B^\e(0\x6d\e(B\e(0\x71\e(B\e(0\x6a\e(B'
Lin=$1
DrawBox $Lin $2 3 25
tput cup $((Lin+2)) $(($2+9)); echo ?
tput cup $((Lin+3)) $(($2+9)); echo ?
tput cup $((Lin+2)) $(($2+17)); echo ?
tput cup $((Lin+3)) $(($2+17)); echo ?
while true
do
HrAtu=$(date +%H%M%S)
for ((i=0; i<=5; i++))
{
for ((j=1; j<=3; j++))
{
tput cup $((Lin+j)) $(($2+2+i*4))
echo -e "$(cut -f$j -d^ <<< "${Num[${HrAtu:i:1}]}")"
}
}
tput cnorm
sleep 1
tput civis
done