Bash脚本如何判断小时数是否为偶数?求更优实现方案
解决Bash脚本偶数整点执行操作的优化方案
针对你的需求,这里有几种更健壮、简洁的实现方式,同时避免前导0导致的八进制数值错误:
方法1:直接获取无前导0的小时数(GNU Date适用)
利用GNU date的%-H格式符,直接输出不带前导0的十进制小时数,无需额外处理:
# 仅在偶数整点(分钟为0)执行操作 if (( $(date +%-H) % 2 == 0 )) && (( $(date +%M) == 0 )); then # 替换为你的操作命令 echo "执行偶数整点任务" fi
优点:代码最简洁,一步到位,避免前导0问题,同时自然兼容00点(会输出0,取余为0符合条件)。
方法2:强制十进制解析(兼容性更强)
如果你的环境不支持GNU date的%-H(比如BSD系统),可以在算术运算中用10#前缀强制bash将带前导0的小时数按十进制解析:
HOUR=$(date +%H) MINUTE=$(date +%M) if (( 10#$HOUR % 2 == 0 )) && (( MINUTE == 0 )); then # 执行你的操作 echo "执行偶数整点任务" fi
优点:兼容所有bash环境,无需修改date的输出格式,同时完美处理08、09这类前导0数值,也不会在00点出现空值问题。
方法3:字符串匹配(直观易懂)
直接匹配时间字符串是否为偶数整点的格式,无需算术运算:
case $(date +%H%M) in 0000|0200|0400|0600|0800|1000|1200|1400|1600|1800|2000|2200) # 执行你的操作 echo "执行偶数整点任务" ;; *) # 非目标时间,跳过 ;; esac
优点:逻辑直观,不需要理解算术运算的细节,适合新手阅读和维护。
补充说明
你之前用HEURE=${HEURE#0}的方法存在一个隐患:当时间为00:00时,去除前导0后会得到空字符串,此时进行取余运算会触发bash语法错误。上面的三种方法都能避免这个问题,同时更健壮。
内容的提问来源于stack exchange,提问作者MilesTEG
相关产品推荐
相关产品推荐

