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 assim
One Moment please: 60 59 58 57 56 55 ...
Existe a possibilidade de substituir o último valor de segundo pelo mais recente, para que a saída não gere uma trilha grande, mas a contagem regressiva de segundos seja como um tempo real em uma posição? (Espero que você entenda o que eu quero dizer :))
command-line
bash
scripts
NES
fonte
fonte
watch
comando, embora eu não tenha certeza exatamente como fazê-lo.Respostas:
fonte
\r
. Veja minha resposta.The old format $[expression] is deprecated and will be removed in upcoming versions of bash.
. Use o POSIX$((expression))
ou o((
comando Por exemplo,sek=$(( sek - 1 ))
ou(( sek = sek - 1 ))
ou(( sek-- ))
.Basicamente, o mesmo que a resposta de aneeshep, mas usa Return (
\r
) em vez de Backspace (\b
) porque não sabemos se o comprimento será sempre o mesmo, por exemplo, quando$sek < 10
.Além disso, o seu primeiro
echo
deve usar$sek
, não código fixo60
.Por fim, observe o espaço após o
...
.fonte
Com o bash, você pode usar a variável especial
SECONDS
.fonte
SECONDS
Essa variável se expande para o número de segundos desde que o shell foi iniciado. (então eu provavelmente não iria configurá-lo para 0 .. apenas testá-lo por 60 segundos mais a partir de quando o script iniciado) .. +1Além de
\r
ou\b
abordagens, é possível usar o\033[2K
caractere de controle , que informa ao terminal para limpar toda a linha. A vantagem disso em comparação com\b
é que você não precisa corresponder o número\b
com a quantidade de caracteres que deseja excluir e comparado com\r
, não haverá caracteres aparecendo na tela se a nova linha for mais curta que a antiga 1.Abaixo está o exemplo de como ele pode ser aplicado a esta pergunta, e aqui está um exemplo do aplicativo relacionado para criar uma saída semelhante às mensagens de inicialização. Neste exemplo em particular, o cronômetro será desativado assim que o segundo segundo for alcançado e a linha do cronômetro será substituída por "Pronto!" frase.
Outra alternativa seria empregar
dialog
comando para criar diálogos simples na linha de comando. A caixa de diálogo permanecerá na tela durante o tempo do cronômetro e será atualizada com o loop e, quando terminar, o cronômetro será substituído pela mensagem "Pronto! Pressione para sair" de uma maneira uniforme:fonte
dialog
não existe no mac: /Isto é o que eu descobri depois de ler aqui e um pouco mais, o único tópico:
Mais legível:
Onde SEC pode ser definido como qualquer número inteiro positivo e o printf cuidará do preenchimento apropriado. Testado no Ubuntu e cygwin.
fonte
Pode alcançá-lo colocando retorno de carro
\r
.Em uma única linha de código, é possível com
echo -ne
ou com
printf
fonte
Temporizador:
e o cronômetro 'normal' é:
Ctrl + c para parar
fonte