Existe alguma maneira de tornar os scripts dinâmicos? [fechadas]

1

Eu preciso do meu script para mostrar o tempo até a próxima execução, continuamente como um temporizador, isso é possível?

    
por Keyshov Borate 24.02.2015 / 15:24

2 respostas

1

Você poderia fazer um monte de trabalho com cálculos matemáticos para que você não tenha que gastar a cada poucos segundos, mas você provavelmente iria querer trabalhar em algum tipo de sincronizador de vez em quando para garantir que o tempo fosse mantido bem.

O loop abaixo apenas define alguns valores iniciais para $h , $m e $s , em seguida, decrementa uma vez a cada 15 segundos e imprime uma linha de contagem regressiva no canto superior esquerdo da tela do terminal (linha 1, coluna 1, 3[Home ) . Você pode fazer o plano de fundo sem problemas, mas você provavelmente desejaria salvá-lo com outro trap s primeiro se ele fosse executado por algum tempo.

(h=23 m=1 s=60; trap '' TTOU
until [ "$(((h-=(!(m-=!(s-=s?15:-45)*(m?1:-59))&&!s))+m+s))" -eq 0 ]
do    sleep 15
      printf "373[H3[KT- %02d : %02d : %02d38" \
             "$h" "$((m?m:60))" "$((s?s:60))"
done) &

A linha impressa é semelhante a esta aqui ...

T- 22 : 49 : 60 
130 mikeserv@localhost ~ %       
130 mikeserv@localhost ~ %       
130 mikeserv@localhost ~ % (     
h=23 m=1 s=60; trap '' TTOU

Na verdade, eu esqueci que ele ainda estava em execução, mas ele continuará a desenhar no mesmo lugar se o terminal não rolar, assim ...

T- 22 : 48 : 30 
130 mikeserv@localhost ~ %       
130 mikeserv@localhost ~ %       
130 mikeserv@localhost ~ % (     
h=23 m=1 s=60; trap '' TTOU

Mas se o terminal rolar a linha, a tela será rolada para fora da tela, até que, no máximo, 15 segundos e ela imprima outra. As fugas utilizadas são normalmente interpretadas como sc (savecursor: 37 ) , hr (linha de início: 3[H ) , kl (kill line: 3[K ) e rc (cursor de restauração: 38 ) . Se algum destes não funcionar para você, você deve verificar com tput para seus valores. Basicamente, a posição do cursor é primeiro salva, depois movida para o topo da tela do terminal, a linha superior é apagada e a contagem regressiva é impressa. A posição do cursor é restaurada.

Funciona equilibrando os decrementos.

Como ...

 h - !(m - !(s - s < 60 ? 15 : -45 ) && !s )

... há um pouco mais do que isso, mas o método é apenas para subtrair um de um valor maior quando um valor menor diminui para 0. Assim, quando o valor de segundos diminui de 1 para 0, o valor de minutos também diminui - e quando ambos minutos e segundos são zero, também diminui o valor das horas.

Quando o loop termina ... nada acontece. Eu realmente não sei o que você quer fazer, mas o que quer que seja, você deve colocar depois do done lá.

Você deve ser capaz de iniciar $h $m e $s em praticamente qualquer valor, mas, conforme escrito, o valor $s econds deverá diminuir em intervalos de 15 segundos <(> é facilmente alterado) . De qualquer forma, apenas tenha isso em mente.

    
por 24.02.2015 / 17:54
2

Algo como

t=1
until [ "$t" -le 0 ]
do
    t=$(($(date -d '2015-02-24 16:40:00' +'%s')-$(date +'%s')))
    sleep 1
    tput clear
    echo $t
done
    
por 24.02.2015 / 15:42