Substituir a saída anterior no Bash em vez de anexá-la

15

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:))

    
por NES 04.12.2010 / 12:43

5 respostas

14
#!/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!"
    
por aneeshep 04.12.2010 / 12:55
15

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!"
    
por Mikel 04.02.2011 / 00:44
6

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'
    
por geirha 04.02.2011 / 00:18
1

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.

    
por Tod 23.11.2015 / 22:22
-2

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

    
por Habitual 04.12.2010 / 14:20