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);
}
}
------------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