14

当在 BASH 中输入某个时间范围内的内容时,我需要运行一个命令,如果不是那个时间,则运行另一个命令。这是我到目前为止所得到的,但它似乎没有工作..

FLATTIME=$(date "+%H%M")
FLATTIME=${FLATTIME##0}

if ! [[ $FLATTIME -gt 1130 ]] ; then
mysql --host=192.168.0.100 --user=myself --password=mypass thedb << EOF
INSERT INTO $STAFFID values ('','$STAFFID','$THETIME','','$THEDATE','$DAYOFWEEK');
EOF

else
mysql --host=192.168.1.92 --user=myself --password=mypass thedb << EOF
UPDATE $STAFFID SET Out_Time='$THETIME' WHERE date='$THEDATE';
EOF
fi

理想情况下,我想要的是这样的:如果时间在上午 8 点到下午 1 点之间执行第一个命令,如果时间在下午 1 点到晚上 11 点之间执行第二个命令,否则回显“有人工作太久”。我尝试了一些变化,但没有运气,它似乎只是运行第一个命令,无论我做什么..

4

1 回答 1

32

在这种情况下,您只需要查看小时。此外,bash 具有指定数字基数的语法,因此您不必担心 08 和 09 是无效的八进制数:

H=$(date +%H)
if (( 8 <= 10#$H && 10#$H < 13 )); then 
    echo between 8AM and 1PM
elif (( 13 <= 10#$H && 10#$H < 23 )); then 
    echo between 1PM and 11PM
else
    echo go to bed
fi

“10#$H”是变量的内容,以 10 为底。


实际上,最好使用%k而不是%H避免无效的八进制问题。

H=$(date -d '08:45' "+%H")
(( 13 <= H && H < 23 )) && echo ok || echo no
bash: ((: 08: value too great for base (error token is "08")

相对

H=$(date -d '08:45' "+%k")
# ....................^^
(( 13 <= H && H < 23 )) && echo ok || echo no
no
于 2013-08-08T14:45:22.850 回答