сценарий удара для таймера

Я хочу записать сценарий удара для выполнения таймера в течение 30 секунд и после 30 секунд, он должен содержать в течение следующих 30 секунд и снова что таймер запустится в течение следующих 30 секунд и продолжит то же.

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

С помощью кода выше, я могу выполнить таймер в течение 30 секунд, но я должен держать в течение следующих 30 секунд и снова должен выполнить таймер в течение следующих 30 секунд.

Как я могу сделать это?

то же самое я могу сделать это в Java с помощью этого кода

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);
    }
}
1
задан 20 September 2017 в 12:59

2 ответа

Перенесите свой цикл в бесконечный цикл ( т.е. while цикл без условий) и добавьте sleep 30 в этом внешнем цикле.

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

я предложил бы, чтобы Вы также удалили wait инструкция и & от" sleep 1 &". Кроме того, print не правильная программа, чтобы записать в терминал, использовать echo вместо этого.

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

знать, что этот таймер не точен, поскольку оценка инструкций по циклу берет (маленький, но не нуль) количество времени. Решение с помощью date было бы предпочтительно: посмотрите, например, функцию обратного отсчета здесь: https://superuser.com/a/611582.

4
ответ дан 3 December 2019 в 06:37

Я думаю, что Вы ищете что-то вроде этого:

#!/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

, С другой стороны, использование date:

#!/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

Для еще большей точности, не храните дату в переменной:

#!/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
1
ответ дан 3 December 2019 в 06:37

Другие вопросы по тегам:

Похожие вопросы: