Cronômetro em shell
Publicado por Joanes Pereira Duarte (última atualização em 14/02/2013)
[ Hits: 10.108 ]
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
Unificando arquivos de bloqueio e liberação no squid
Criar usuários com ponto (nome.usuario) no Slackware
Automatizando com Script-Expect
Script de Instalação de Layer7 no CentOS 6.0
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
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
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (8)