você está aqui: Home  → Arquivo de Mensagens

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


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

 

 

Opinião dos Leitores

julio Neves
23 Ago 2017, 09:52
Já descobri o erro. Provavélmente na conversão para o html da página colocou um ponto de perguntação (?) no lugar do ^+zero (⁰).

Por favor, edite o programa e nas linhas:

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 ?

Troque esses pontos de interrogação por um ⁰ que vc conseque teclando o circunflexo e depois o zero (^0).
julio Neves
23 Ago 2017, 09:45
Fala Valdir,
vc poderia ser mais explícito? Não entendi direito o que vc quis dizer.

Se eu colocasse um 2 pontos (:) entre a hora e o minuto, iria ficar desproporcional pq cada número é escrito em 3 linhas, um dois pontos iria ficar muito pequeno. Por isso, optei em colocar dois pequenos ⁰, usando duas linhas e deve ser isso que está dando zebra na sua máquina. Mas gostaria de entender o que aconteceu para ver o que fazer.
Valdir Soares
23 Ago 2017, 07:41
Testei e funciona mas substitui dois pontos de interrogação "?" por um ":" entre os valores hora, min, seg.
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script