#!/bin/bash
sek=60
echo "60 Seconds Wait!"
echo -n "One Moment please "
while [ $sek -ge 1 ]
do
echo -n "$sek"
sleep 1
sek=$[$sek-1]
echo -en "\b\b"
done
echo
echo "ready!"
Para um cronômetro bash eu uso este código:
#!/bin/bash
sek=60
echo "60 Seconds Wait!"
echo -n "One Moment please "
while [ $sek -ge 1 ]
do
echo -n "$sek "
sleep 1
sek=$[$sek-1]
done
echo
echo "ready!"
Isso me dá algo parecido com isso
One Moment please: 60 59 58 57 56 55 ...
Existe a possibilidade de substituir o último valor de segundo pelo mais recente, de modo que a saída não gere uma trilha grande, mas a contagem regressiva de segundos, como um tempo real, em uma posição? (Espero que você entenda o que eu quero dizer:))
#!/bin/bash
sek=60
echo "60 Seconds Wait!"
echo -n "One Moment please "
while [ $sek -ge 1 ]
do
echo -n "$sek"
sleep 1
sek=$[$sek-1]
echo -en "\b\b"
done
echo
echo "ready!"
Basicamente é o mesmo que a resposta de aneeshep, mas usa Return ( \r
) em vez de Backspace ( \b
) porque não sabemos se o tamanho será sempre o mesmo, por exemplo, quando $sek < 10
.
Além disso, seu primeiro echo
deve usar $sek
, não codificar 60
.
Por fim, observe o espaço após o ...
.
#!/bin/bash
sek=60
echo "$sek Seconds Wait!"
while [ $sek -ge 1 ]
do
echo -ne "One Moment please $sek ... \r"
sleep 1
sek=$[$sek-1]
done
echo
echo "ready!"
Com o bash você pode usar a variável especial SECONDS
.
#BASH
SECONDS=0;
while sleep .5 && ((SECONDS <= 60)); do
printf '\r%s: %2d' "One moment please" "$((60-SECONDS))"
done
printf '\n'
Isto é o que eu criei depois de ler aqui e um pouco mais, o único forro:
SEC=101;for i in 'seq $SEC -1 1';do printf "\rNext in: %'expr length $SEC'ds" "$i";sleep 1;done;echo
Mais legível:
#!/bin/bash
SEC=101
for i in 'seq $SEC -1 1';do
printf "\rNext in: %'expr length $SEC'ds" "$i";
sleep 1;
done
echo
Onde SEC pode ser definido para qualquer número inteiro positivo e o printf cuidará do preenchimento apropriado. Testado no Ubuntu e no cygwin.
Contador regressivo:
MIN=1 && for i in $(seq $(($MIN*60)) -1 1); do echo -n "$i, "; sleep 1; done; echo -e "nnMessage"
e o cronômetro 'normal' é:
START=$( date +%s ); while true; do CURRENT=$( date +%s ) ; echo $(( CURRENT-START )) ; sleep 1 ; echo -n ; done
controle + c para parar
Tags command-line bash scripts