Cronômetro em shell
Publicado por Joanes Pereira Duarte (última atualização em 14/02/2013)
[ Hits: 10.061 ]
Olá, segue um script que fiz em forma de cronômetro, é possível marcar o tempo progressivamente e regressivamente e marcar um limite de tempo.
Segue sua forma de uso:
.......................................................................................................
OPÇÕES
-p, --progressive Inicia o cronometro em ordem progressiva
Obs.:Para limitar o tempo na contagem progressiva,
é necessário informar o tempo final no formato
hh:mm:ss.
-r, --regressive Inicia o cronometro em ordem regressiva.
Obs.: Necessário informar tempo inicial
no formato hh:mm:ss.
-h, --help Mostra esta tela de ajuda e sai
-V, --version Mostra a versão do programa e sai
EXEMPLOS DE USO:
$./crono -p.................contagem progressiva infinita
$./crono -p 01:00:00........contagem progressiva de 1 hora
$./crono -r 01:00:00........contagem regressiva de 1 hora
........................................................................................
Espero que seja útil a alguém.
Abraço.
#!/bin/bash # crono.sh # # Cronometro em shell # # Versão 1.0: Marcação do tempo de forma progressiva # Versão 1.1: Adicionado opção para tempo regressivo # Versão 1.2: Adicionado opção para tempo limite na contagem progressiva # Versão 1.3: Adicionado opção para pausa do tempo # Versão 1.4: Adicionado efeitos na forma como o tempo é exibido na tela # # Joanes Duarte, Janeiro 2013 # ###############################[ FUNÇÕES ]################################# ### Função para mostras as opções de uso do programa opcoes_de_uso(){ echo "Uso: $(basename "$0") [OPÇÔES] OPÇÕES -p, --progressive Inicia o cronometro em ordem progressiva Obs.:Para limitar o tempo na contagem progressiva, é necessário informar o tempo final no formato hh:mm:ss. -r, --regressive Inicia o cronometro em ordem regressiva. Obs.: Necessário informar tempo inicial no formato hh:mm:ss. -h, --help Mostra esta tela de ajuda e sai -V, --version Mostra a versão do programa e sai EXEMPLOS DE USO: $./crono -p.................contagem progessiva infinita $./crono -p 01:00:00........contagem progressiva de 1 hora $./crono -r 01:00:00........contagem regressiva de 1 hora " && exit 1 } ### Função que faz a conversão do tempo de segundos para o formato hh:mm:ss calcula_tempo(){ if [ $TEMPO -lt 60 ] ; then HORAS=0 MINUTOS=0 SEGUNDOS=$TEMPO elif [ $TEMPO -lt 3600 ] ; then HORAS=0 MINUTOS=$(($TEMPO / 60)) SEGUNDOS=$(($TEMPO % 60)) else HORAS=$(($TEMPO / 3600)) RESTO=$(($TEMPO % 3600)) MINUTOS=$(($RESTO / 60)) SEGUNDOS=$(($RESTO % 60)) fi # Após calculado o tempo, formata a saída para o padrão de 2 dígitos HORASF=$(printf '%.2d' $HORAS) MINUTOSF=$(printf '%.2d' $MINUTOS) SEGUNDOSF=$(printf '%.2d' $SEGUNDOS) } ### Função principal que atualiza o tempo na tela automaticamente conta_tempo(){ clear # Se o operador não for negativo, define variável $TEMPO como -1 [ "$OP" = '-' ] || { TEMPO=-1 ; } # Início do laço que atualiza o tempo na tela while [ "$TECLA" != '(f|p)' ] && [ "$TEMPO_FINAL" -gt 0 ] do clear TEMPO=$(($TEMPO $OP 1)) TEMPO_FINAL=$(($TEMPO_FINAL - 1)) # Chamada da função que converte o tempo para o formato hh:mm:ss a cada ciclo # do loop. calcula_tempo # Feito os calculos, imprime na tela echo -e "{FONTE}33[40;37;1m.........................{FONTE}33[m" echo -e "{FONTE}33[40;37;1m| START: $HORASF:$MINUTOSF:$SEGUNDOSF |{FONTE}33[m" echo -e "{FONTE}33[40;37;1m.........................{FONTE}33[m" echo -e "{FONTE}33[40;37;1m|{FONTE}33[m{FONTE}33[40;37m [f]inalizar \ [p]ausar {FONTE}33[m{FONTE}33[40;37;1m|{FONTE}33[m" echo -e "{FONTE}33[40;37;1m.........................{FONTE}33[m" read -n1 -t 1 TECLA # Aguarda 1 segundo pela tecla, se não, continua # Conforme a tecla digitada, direciona para a função específica case "$TECLA" in f) finalizar ;; p) pausar ;; [[:alnum:]]) sleep 1 && continue ;; # Qualquer tecla exceto f e p, # aguarda 1 segundo e continua esac done finalizar } ### Função que mostra a tela final depois de encerrado o script finalizar(){ clear echo -e "{FONTE}33[40;33;1m FINISH: $HORASF:$MINUTOSF:\ $SEGUNDOSF {FONTE}33[m" exit 0 } ### Função que faz pausa no tempo pausar(){ while [ "$TECLA" != 'c' ] ; do clear echo -e "{FONTE}33[40;37;1m.........................{FONTE}33[m" echo -e "{FONTE}33[40;37;1m| PAUSE: $HORASF:$MINUTOSF:$SEGUNDOSF |{FONTE}33[m" echo -e "{FONTE}33[40;37;1m.........................{FONTE}33[m" echo -e "{FONTE}33[40;37;1m|{FONTE}33[m{FONTE}33[40;37m[c]ontinuar \ [f]inalizar{FONTE}33[m{FONTE}33[40;37;1m|{FONTE}33[m" echo -e "{FONTE}33[40;37;1m.........................{FONTE}33[m" read -n1 -t 1 TECLA case "$TECLA" in f) finalizar ;; esac done } ### Função que mostra a versão atual do programa versao() { e cho -n $(basename "$0") # Extrai versão diretamente do cabeçalho do programa grep '^# Versão ' "$0" | tail -1 | cut -d : -f 1 | tr -d \# exit 0 } ### Função que testa e converte o parâmetro '$2' para segundos teste_par2() { # Testa formato de tempo passado no parâmetro 2. Deve ser hh:mm:ss [[ "$TEMPO_LIMITE" != [0-9][0-9]:[0-5][0-9]:[0-5][0-9] ]] && \ echo "Tempo deve ser passado no formado hh:mm:ss" && exit 1 # Passado no teste do parâmetro '$2' faz a conversão para segundos HORAS=$(echo $TEMPO_LIMITE | cut -d : -f 1) && HORAS=$(($HORAS * 3600)) MINUTOS=$(echo $TEMPO_LIMITE | cut -d : -f 2) && MINUTOS=$(($MINUTOS * 60)) SEGUNDOS=$(echo $TEMPO_LIMITE | cut -d : -f 3) TEMPO=$(($HORAS+$MINUTOS+$SEGUNDOS+1)) TEMPO_FINAL=$TEMPO conta_tempo } #################[ Tratamento das opções de linha de comando ]############### # Testa se foi passado parâmetro '$1' [ "$1" ] || { opcoes_de_uso ; } # Passado parâmetro '$1', faz o tratamento do mesmo while test -n "$1" do case "$1" in -p | --progressive) OP=+ ; TEMPO=-1 # Se tiver parâmetro 2, chama a funçao para teste do mesmo, caso não # tenha, define as variáveis e chama direto a função conta_tempo [ "$2" ] || { TEMPO_FINAL=999999 ; conta_tempo ; } TEMPO_LIMITE=$2 && teste_par2 ;; -r | --regressive) # Testa se foi passado o parâmetro $2, que neste caso é obrigatório [ "$2" ] || { echo "Necessário informar o tempo inicial para \ início da contagem regressiva" ; exit 1 ; } TEMPO_LIMITE=$2 ; OP=- && teste_par2 ;; -h | --help) opcoes_de_uso ;; -V | --version) versao ;; *) opcoes_de_uso ;; esac done
POSTFIX AUTOMÁTICO COM MYSQL E IPTABLES - CRIANDO USUÁRIOS A PARTIR DE ARQUIVO
Script de Backup para FITA DAT usando "tar"
Script para gravar 2 (ou 4) CDs simultaneamente
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Wifi não funciona no Aspire ES 15 com o Debian (9)
Como atualizar o Debian 8 para o 10 (10)
Dica sobre iptables ACCEPT e DROP (6)
NGNIX - Aplicar SNAT para evitar roteamento assimetrico (29)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta