DEV Community

Lercio Teotonio Gontijo
Lercio Teotonio Gontijo

Posted on

Calendário colorido baseado no Linux "cal"

Este Calendário tem o objetivo de exibir o calendário do mês corrente deixando em destaque o dia corrente e os feriados baseados no Brasil que pode ser configurado no arquivo .Cal.
O programa é escrito em BASH e pode receber 1 ou 2 parâmetros que são o mês e o ano, por exemplo: Cal 1 2024. Para funcionar você deve colocar o script e o .Cal em $HOME/bin.

O objetivo principal é didático e você pode editar o script para adequar ao seu idioma.

#!/bin/bash
#==================================================================
#   Membro ....................... Cal
#   Autor ........................ LERCIO TEOTONIO GONTIJO
#   Local ........................ BELO HORIZONTE - BARREIRO
#   Data ......................... 25 DEZEMBRO 2023
#   Funcao ....................... Exibir o Calendario do Mes 
#==================================================================
#   DEFINICAO DAS BORDAS 
#==================================================================
lineh="\u2550"
linev="\u2551"
topleft="\u2554"
topright="\u2557"
bottomleft="\u255A"
bottomright="\u255D"
crossleft="\u2560"
crossright="\u2563"
crosstop="\u2566"
crossbottom="\u2569"
cross="\u256C"
#==================================================================
#   DEFINICAO DAS CORES 
#==================================================================
Padrao="\x1b[39m"
Bold="\x1B[1m"
Normal="\x1B[0m"
Preto="\x1B[30m"
Vermelho="\x1B[31m"
Verde="\x1B[32m"
Amarelo="\x1B[33m"
Azul="\x1B[34m"
Magenta="\x1B[35m"
Ciano="\x1B[36m"
LGray="\x1B[37m"
DGray="\x1B[90m"
LVermelho="\x1B[91m"
LVerde="\x1B[92m"
LAmarelo="\x1B[93m"
LAmarelo="\x1B[94m"
LAzul="\x1B[94m"
LMagenta="\x1B[95m"
LCiano="\x1B[96m"
Branco="\x1B[97m"
BAzuL="\u001b[44m"
BPreto="\u001b[40m"
BLA="\u001b[43m"
BLA="\u001b[103m"
#==================================================================
#   Este programa escrito em linguagem BASH tem o objetivo
#   de exibir o calendario do mes corrente de forma colorida
#   e muito elegante.
#   Voce pode simplismente executar o comando "cal" que faz
#   a mesma coisa, mas com intuito de ensinar truques e
#   segredos do BASH (SHELL) de forma somente didatica
#==================================================================
#set -x
Feriados=()
while read -r linha;do
  x=${linha:0:5}
  Feriados+="$x "
done < .Cal
#echo -en "${Feriados[@]}\n"

hoje=`TZ='America/Sao_paulo' date +%F`  # Obtem data (YYYY-MM-DD)
# hoje=2023-12-24
# Observe que no comando abaixo esta eh a forma que o BASH tem
# para fazer um substring onde parametro 1 eh a variavel, 2 eh
# inicio e 3 o tamanho
ano=${hoje:0:4}     # Obtem o ano
mes=${hoje:5:2}     # Obtem o mes
dia=${hoje:8:2}     # Obtem o dia
mes=$((mes+0))      # REMOVE O ZERO A ESQUERDA SE HOUVER
dia=$((dia+0))      # REMOVE O ZERO A ESQUERDA SE HOUVER


if [ $# -gt 0 ];then
  if [ $# -eq 2 ];then
    mes=$1
    ano=$2
   else
    mes=$1
   fi
fi
#==================================================================
#   MATRIX DE NOMES DAS SEMANAS
#==================================================================
semanas=("Domingo" "Segunda" "Terca" "Quarta" "Quinta" "Sexta" "Sabado")
#==================================================================
#   MATRIX DE DIAS DE CADA MES DO ANO
#==================================================================
dias=(31 28 31 30 31 30 31 31 30 31 30 31)
bissexto=$(($ano%4))
if [ $bissexto -eq 0 ];then
  dias[1]=29
fi
#==================================================================
#   Obtem o numero do dia da semana do primeiro dia do mes
#   Sendo que 0 = domingo e 6 = sabado
#==================================================================
#==================================================================
#   MATRIX DE NOMES DO MESES
#==================================================================
meses=("Janeiro" "Fevereiro" "Marco" "Abril" "Maio" "Junho" \
    "Julho" "Agosto" "Setembro" "Outubro" "Novembro" "Dezembro")
horas=`TZ=America/Sao_Paulo date +%R`

echo -en "$BLA$Branco$Bold"
echo -en $topleft   # EXIBE O CANTO SUPERIOR ESQUERDO
O=69            # DEFINO O LIMITE DE LINHA HORIZONTAIS
for((i=0;i<$O;i++));do
 echo -en $lineh    # EXIBE LINHAS HORIZONTAIS
done
echo -en "$topright"    # EXIBE O CANTO SUPERIOR DIREITO
echo -en "$Normal\n$BLA$Branco$Bold"
echo -en $linev
s=`printf "%37s" "${meses[$mes-1]^^} $ano $horas"`
echo -en "$s"
s=`printf "%32s" " "`
echo -en "$s"
echo -en "$linev"
echo -en "$Normal\n$BLA$Branco$Bold"
echo -en "$crossleft"
for((i=0;i<$O-10;i+=10));do 
  echo -en "═════════$crosstop"; 
done
echo -en "═════════$crossright"
echo -en "$Normal\n$BLA$Branco$Bold"
echo -en "$linev"
for((i=0;i<7;i++))
do
  c="$Preto"
  if [ $i -eq 0 ] || [ $i -eq 6 ];then
    c="$Branco"
  fi
  s=`printf "%8s" "${semanas[$i]^^}"`
  echo -en "$c$s$Branco $linev"
done
echo -en "$Normal\n$BLA$Branco$Bold"
echo -en "$crossleft"
for((i=0;i<$O-10;i+=10));do 
  echo -en "═════════$cross" 
done
echo -en "═════════$crossright"
echo -en "$Normal\n$BLA$Branco$Bold"
echo -en "$linev"
p=`date +%w --date="$ano-$mes-01"`
for((i=0;i<$p;i++));
do
  for((j=0;j<9;j++));do echo -en " ";done
  echo -en "$linev"
done
for((k=$i,d=1;k<7;d++,k++))
do
  t=$d
  c="$Branco"
  m=`printf "%02d" $mes`
  n=`printf "%02d" $d`
  m=`cat ~/bin/.Cal|grep "$n $m"`
  if [ "$m" != "" ];then
    feriado=${m:0:2}
    feriado=$((feriado+0))
    if [ $feriado -eq $d ];then
      c="$LMagenta"
    fi
  fi
  if [ $k -eq 6 ] || [ $k -eq 0 ];then
    c="$LAmarelo"
  fi
  if [ $d -eq $dia ];then c="$Bold$Preto";fi
  if [ $d -lt 10 ];then t="0$d";fi
  echo -en "    $c$t$Branco   $linev"
done
echo -en "$Normal\n$BLA$Branco$Bold"
echo -en "$linev"
u=${dias[$mes-1]}
i=$((0))
for((d=$d;d<$u+1;d++,i++))
do
  t=$d
  c="$Branco"
  m=`printf "%02d" $mes`
  n=`printf "%02d" $d`
  m=`cat ~/bin/.Cal|grep "$n $m"`
  if [ "$m" != "" ];then
    feriado=${m:0:2}
    feriado=$((feriado+0))
    if [ $feriado -eq $d ];then
      c="$LMagenta"
    fi
  fi
  if [ $d -lt 10 ]; then t="0$d";fi
  if [ $i -eq 6 ] || [ $i -eq 0 ] || [ $i -eq 7 ];then c="$LAmarelo";fi
  if [ $d -eq $dia ];then c="$Bold$Preto";fi
  if [ $i -gt 6 ];then 
    echo -en "$Normal\n$BLA$Branco$Bold"
    echo -en "$linev"
    i=$((0))
  fi
  echo -en "    $c$t$Branco   $linev"
done
for((i=$i;i<7;i++));do echo -en "         $linev";done
echo -en "$Normal\n$BLA$Branco$Bold"
echo -en "$bottomleft"
for((i=0;i<$O-10;i+=10));do 
  echo -en "═════════$crossbottom"; done
echo -en "═════════$bottomright"

echo -en "$Normal\n"

Enter fullscreen mode Exit fullscreen mode

Aqui também está um exemplo do arquivo .Cal onde estão os feriados:

01 01 Confraternizacao universal
12 02 Carnaval
13 02 Carnaval
29 03 Sexta feira santa
01 05 Dia do Trabalho
30 05 Corpus Christi
15 08 Nossa Senhora Boa Viagem
15 11 Proclamacao da Republica
20 11 Consciencia Negra
25 12 Natal

Enter fullscreen mode Exit fullscreen mode

Espero que a comunidade me perdoe por escrever meu POST em pt_BR.

Críticas e sugestões são sempre bem vindas!

Top comments (0)