Cronômetro em shell
Publicado por Joanes Pereira Duarte (última atualização em 14/02/2013)
[ Hits: 10.197 ]
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
Instalação da Multilib no Slackware
Barra de progresso em shell script com cores roxa e verde
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Título: Descobrindo o IP externo da VPN no Linux
Armazenando a senha de sua carteira Bitcoin de forma segura no Linux
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Instalação Microsoft Edge no Linux Mint 22
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado
Máquinas Virtuais com IP estático acessando Internet no Virtualbox
Tela GNU GRUP versão 2.12 ao reiniciar. Como posso resolver? (1)
Tela GNU GRUP versão 2.12 ao reiniciar. Como posso resolver? (1)