Bash脚本判断当前时间在指定区间时代码始终不执行问题排查
故障根因
你代码里的判断逻辑完全不生效,核心是两个问题:
[[ ]]语法里的>、<是字典序(字符串ASCII顺序)比较,不是数值比较,而且你写的左边界8:29没有补前导零,和date +%H:%M输出的固定两位小时格式不匹配——date +%H:%M在上午8-9点输出的时间是08:xx、09:xx,字符串第一位是0,ASCII码比8小,所有10点前的时间和8:29做比较时,都会被判定为「小于8:29」,第一个判断条件直接不成立。举个实际例子:上午8点30分currenttime值为08:30,字符串比较时"08:30" > "8:29"返回结果为假,自然进不了代码块。- 就算你补了前导零,字符串比较判断时间区间的容错性极差,只要时间格式稍微不一致(比如多了空格、秒数没对齐)就会判断失效,不是可靠的实现方式。
可直接落地的修复方案
方案1(推荐):转成分钟数做纯数值比较
把时间统一换算成当日0点至今的累计分钟数,纯数值比较完全不受字符串格式影响,不会出逻辑问题:
# 转当前时间为总分钟数,加10#前缀强制按10进制解析,避免08、09被识别为8进制报错 current_total_min=$((10#$(date +%H)*60 + 10#$(date +%M))) # 区间边界也转成总分钟:8:29=8*60+29=509,18:30=18*60+30=1110 if [[ $current_total_min -gt 509 && $current_total_min -lt 1110 ]]; then # 此处替换为你要执行的业务代码 your_target_code fi
方案2:对齐时间格式后做字符串比较
如果不想做数值换算,就把比较的边界时间补上前导零,和date +%H:%M的输出格式完全对齐,字典序比较才能正常生效:
currenttime=$(date +%H:%M) # 注意左边界补零成08:29,和输出格式一致 if [[ "$currenttime" > "08:29" ]] && [[ "$currenttime" < "18:30" ]]; then # 此处替换为你要执行的业务代码 your_target_code fi
注意:如果你的需求是包含8:29和18:30两个边界点,把比较符换成>=/<=(字符串比较)或者-ge/-le(数值比较)即可。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

