скрипт bash для таймера

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

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

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

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

То же самое я могу сделать это в 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

6 ответов

Заверните свою петлю в бесконечный цикл (т. е. цикл 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.

3
ответ дан 22 May 2018 в 18:17

Заверните свою петлю в бесконечный цикл (т. е. цикл 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.

3
ответ дан 18 July 2018 в 06:31

Заверните свою петлю в бесконечный цикл (т. е. цикл 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.

3
ответ дан 24 July 2018 в 18: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

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

#!/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
ответ дан 22 May 2018 в 18:17

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

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

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

#!/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
ответ дан 18 July 2018 в 06:31

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

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

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

#!/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
ответ дан 24 July 2018 в 18:37

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

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