たとえば、現在の時刻が午前 11 時 10 分から午後 2 時 30 分までの場合にのみ「コマンド」を実行する必要があるとします。これはbashスクリプトでどのように行うことができますか?
疑似言語で書かれた以下のようなもの:
#!/bin/bash
while(1) {
if ((currentTime > 11:10am) && (currentTime <2:30pm)) {
run command;
sleep 10;
}
}
他の回答では、数字が で始まる場合0
、Bash はそれを基数 8 †で解釈することを見落としています。たとえば、午前 9 時に、Bash では無効な数値 (もう違います)。date '+%H%M'
が返されます。0900
最新の Bash を使用した適切で安全なソリューション:
while :; do
current=$(date '+%H%M') || exit 1 # or whatever error handle
(( current=(10#$current) )) # force bash to consider current in radix 10
(( current > 1110 && current < 1430 )) && run command # || error_handle
sleep 10
done
最初の実行で 10 秒の遅延が発生する可能性がある場合は、少し短縮できます。
while sleep 10; do
current=$(date '+%H%M') || exit 1 # or whatever error handle
(( current=(10#$current) )) # force bash to consider current in radix 10
(( current > 1110 && current < 1430 )) && run command # || error_handle
done
終わり!
†見て:
$ current=0900
$ if [[ $current -gt 1000 ]]; then echo "does it work?"; fi
bash: [[: 0900: value too great for base (error token is "0900")
$ # oooops
$ (( current=(10#$current) ))
$ echo "$current"
900
$ # good :)
xsc がコメントで指摘しているように、それは古代の[
ビルトインで動作します...しかし、それは過去のものです:)
。
次のようなものを試すことができます:
currentTime=$(date "+%H%M")
if [ "$currentTime" -gt "1110" -a "$currentTime" -lt "1430" ]; then
# ...
fi
# ...
または :
currentTime=$(date "+%H%M")
if [ "$currentTime" -gt "1110" ] && [ $currentTime -lt "1430" ]; then
# ...
fi
# ...
または :
currentTime=$(date "+%H%M")
[ "$currentTime" -gt "1110" ] && [ "$currentTime" -lt "1430" ] && {
# ...
}
# ...
詳細については、を参照man date
してください。cron ジョブを使用して、このスクリプトを 11:30 から実行する以外のこともできます。
注意:ループには、次のようなものを使用できます:
while [ 1 ]; do
#...
done
または :
while (( 1 )); do
#...
done