ubuntu - línea de comando - script bash para temporizador

CorePress2023-09-17  1

Quiero escribir un script bash para ejecutar un temporizador durante 30 segundos y, después de 30 segundos, debería mantenerse durante los siguientes 30 segundos y nuevamente ese temporizador comenzará durante los próximos 30 segundos y continuará igual.

for ((i=30; i>0; i--)); do
   sleep 1 &
   print "$i \r"
   wait
done

Usando el código anterior, puedo ejecutar el cronómetro durante 30 segundos, pero necesito mantenerlo presionado durante los siguientes 30 segundos y nuevamente necesito ejecutar el cronómetro durante los siguientes 30 segundos.

¿Cómo puedo hacer esto?

lo mismo puedo hacerlo en java usando este código

import java.util.Timer;
import java.util.TimerTask;
public class TestClass {
    static int count = 0;
    public static void main(String[] args)  {
        final TestClass test = new TestClass();
                Timer timer = new Timer();
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        test.doStuff();
                      }
                }, 0, 1000);
    }
    public void doStuff() {
        if (count == 30) {
            try {
                Thread.sleep(30000);
                count = 0;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(++count);
    }
}
  • No entiendo. ¿Cuántos periodos de 30 segundos necesitas? ¿Necesitas esperar 30 segundos y luego hacer qué? ¿Y luego empezar de nuevo? ¿Cuántas veces debería ejecutarse? Edite su pregunta y aclare. -terdon 20 de septiembre de 2017 a las 9:40
  • después de ejecutar los primeros 30 segundos, el cronómetro debe mantenerse durante los siguientes 30 segundos y luego el cronómetro debe comenzar nuevamente durante los siguientes 30 segundos. Y esto debería continuar @terdon -sourav 20 de septiembre de 2017 a las 9:44


------------Respuesta------------

Envuelva su bucle en un bucle infinito (es decir, un bucle while sin condiciones) y agregue un sueño 30 en este bucle externo.

while :
do
    ###  < your
    ###   timer
    ###   here >
    sleep 30
done

Te sugiero que también elimines la instrucción de espera y el & de "dormir 1 &". Además, print no es el programa adecuado para escribir en la terminal; utilice echo en su lugar.

while :
do
    for ((i=30; i>0; i--))
    do
       sleep 1 
       echo -n "$i "
    done
    sleep 30
    echo ""
done

Tenga en cuenta que este temporizador no es preciso ya que evaluar las instrucciones del bucle lleva una cantidad de tiempo (pequeña, pero no nula). Sería preferible una solución que utilice la fecha: consulte, por ejemplo, la función de cuenta regresiva aquí: https://superuser.com/a/611582.




------------Respuesta------------

Creo que estás buscando algo como esto:

#!/bin/bash

## Infinite loop
while :; do
        ## Run a sleep command for 30 seconds in the background
        sleep 30 &
        ## $! is the PID of the last backgrounded process, so of the sleep.
        ## Wait for it to finish.
        c=30
        while [[ -e /proc/$! ]]; do
                printf '%s\r' "$(( --c ))"
                ## For more precision, comment the line below. This causes the
                ## script to wait for a second so it doesn't spam your CPU.
                ## If you need accuracy, comment the line out. Although, if you
                ## really need accuracy, don't use the shell for this.
                sleep 1
        done
done

Como alternativa, utilice la fecha:

#!/bin/bash
waitTime=30;
## Infinite loop
while :; do
        startTime=$(date +%s)
        currentTime=$(date +%s)
        c=$waitTime;
        while [[ $((currentTime - startTime)) -lt $waitTime ]]; do
                printf '%s\r' "$(( --c ))"  
                ## For more precision, comment the line below. This causes the
                ## script to wait for a second so it doesn't spam your CPU.
                ## If you need accuracy, comment the line out. Although, if you
                ## really need accuracy, don't use the shell for this.
                sleep 1
                currentTime=$(date +%s)
        done
        c=0
        echo "";
done

Para una precisión aún mayor, no almacene la fecha en una variable:

#!/bin/bash
waitTime=4;
while :; do
        startTime=$(date +%s)
        c=$waitTime;
        while [[ $(($(date +%s) - startTime))  -lt $waitTime ]]; do
                printf '%s\r' "$(( --c ))"  
                sleep 1
        done
        c=0
done