Contagem regressiva do script bash 5 minutos em uma única linha [fechada]

23

Eu gostaria de ter uma contagem regressiva de 5 minutos, atualizando a cada segundo e mostrando o resultado na mesma linha. Isso é possível com o script Bash?

ptheofan
fonte
O que a contagem regressiva faz? Você precisa ser um pouco mais específico sobre a coisa toda.
Adrian Frühwirth
Isso é absolutamente possível. Se você nos perguntar por que (que problema real de administração de sistema / rede você está tentando resolver), podemos dizer qual dos muitos métodos disponíveis para fazer isso provavelmente funcionará melhor para você. Se é um general "Como posso fazer isso em um bash? Script` pergunta a pergunta é provavelmente melhor adequado para Unix e Linux - deixe-me saber e eu posso migrá-lo lá para você :)
voretaq7
Aqui está uma maneira de github.com/himanshub16/MyScripts/blob/master/countdown.sh
Himanshu Shekhar

Respostas:

42

Isso funciona a partir do shell Bash:

secs=$((5 * 60))
while [ $secs -gt 0 ]; do
   echo -ne "$secs\033[0K\r"
   sleep 1
   : $((secs--))
done

O caractere especial \ 033 [OK representa um final de linha que limpa o restante da linha, se houver algum caractere restante da saída anterior e \ r é um retorno de carro que move o cursor para o início da linha. Há um tópico interessante sobre esse recurso em stackoverflow.com .

Você pode adicionar comandos próprios ou qualquer outra coisa no loop while. Se você precisar de algo mais específico, forneça-me mais detalhes.

dsmsk80
fonte
Você quer dizer \ 033 [K conforme ascii-table.com/ansi-escape-sequences.php em vez de 0K?
Jody Lee Bruchon
Eu coloquei \rno início para colocar o cursor no final da linha (o que impede que oculte o primeiro caractere). Aqui está a versão atualizada: gist.github.com/boillodmanuel/676b3af823fae4177f1d0b41a6f23442 Obrigado
user1067920 8/11
13

Aqui está um com uma melhoria do formato de saída correto (HH: MM: SS) com zeros à esquerda e horas de suporte adequadas:

#!/bin/bash

m=${1}-1 # add minus 1 

Floor () {
  DIVIDEND=${1}
  DIVISOR=${2}
  RESULT=$(( ( ${DIVIDEND} - ( ${DIVIDEND} % ${DIVISOR}) )/${DIVISOR} ))
  echo ${RESULT}
}

Timecount(){
        s=${1}
        HOUR=$( Floor ${s} 60/60 )
        s=$((${s}-(60*60*${HOUR})))
        MIN=$( Floor ${s} 60 )
        SEC=$((${s}-60*${MIN}))
     while [ $HOUR -ge 0 ]; do
        while [ $MIN -ge 0 ]; do
                while [ $SEC -ge 0 ]; do
                        printf "%02d:%02d:%02d\033[0K\r" $HOUR $MIN $SEC
                        SEC=$((SEC-1))
                        sleep 1
                done
                SEC=59
                MIN=$((MIN-1))
        done
        MIN=59
        HOUR=$((HOUR-1))
     done
}

Timecount $m

Fornece uma saída parecida com esta:

02:04:15
rahuL
fonte
A saída não é suficiente HH:MM:SS. Por um dígito, minutos ou segundos, você pode ver 00:4:5.
Chishaku # 14/15