Я хочу записать сценарий удара для выполнения таймера в течение 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);
}
}
Перенесите свой цикл в бесконечный цикл ( т.е. 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.
Я думаю, что Вы ищете что-то вроде этого:
#!/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