30秒間タイマーを実行するbashスクリプトを作成し、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);
}
}
ループを無限ループにラップし(ie条件なしの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