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.


Relógio digital em bash

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 :-)

( Download do código )

#!/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

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Rubens Queiroz de Almeida