3

たとえば、現在の時刻が午前 11 時 10 分から午後 2 時 30 分までの場合にのみ「コマンド」を実行する必要があるとします。これはbashスクリプトでどのように行うことができますか?

疑似言語で書かれた以下のようなもの:

#!/bin/bash
while(1) {
    if ((currentTime > 11:10am) && (currentTime <2:30pm)) {
        run command;
        sleep 10;
    }
}
4

3 に答える 3

7

他の回答では、数字が で始まる場合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 がコメントで指摘しているように、それは古代の[ビルトインで動作します...しかし、それは過去のものです:)

于 2013-11-03T17:25:43.443 に答える
2

次のようなものを試すことができます:

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
于 2013-11-03T16:53:10.297 に答える