You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中对date +%j的执行结果进行取模运算?

问题描述

以下是我的代码:

#!/bin/bash
#This works
MIN_SEQ_NO=$(date +%M)
echo "Minute" $MIN_SEQ_NO
MOD_VAL=$((MIN_SEQ_NO % 5))
echo "Minute Mod 5:" $MOD_VAL


#This works
DAY_SEQ_NO=$(date +%d)
echo "Day of Month:" $DAY_SEQ_NO
MOD_VAL=$((DAY_SEQ_NO % 5))
echo "Day of Month Mod 5:" $MOD_VAL

#But not this
DOY_SEQ_NO=$(date +%j)
echo "Day of Year " $DOY_SEQ_NO
MOD_VAL=$((DOY_SEQ_NO % 5))
echo "Day of Year Mod 5:" $MOD_VAL

今天是当月12日,我预期取模结果为2。请问如何在Bash中对date +%j的结果进行取模运算?


问题原因

date +%j返回带前导零的三位数(比如1月12日会返回012),而Bash中以0开头的数字会被解析为八进制数。八进制的012等于十进制的10,10%5结果为0,这就是和预期不符的核心原因。

解决方案

有两种简单有效的处理方式:

方法1:去除前导零

利用Bash参数扩展去掉数字开头的零:

DOY_SEQ_NO=$(date +%j)
# 移除前导零
DOY_DEC=${DOY_SEQ_NO#0}
MOD_VAL=$((DOY_DEC % 5))
echo "Day of Year Mod 5:" $MOD_VAL

方法2:强制十进制解析

在算术表达式中用10#前缀强制按十进制解析数字:

DOY_SEQ_NO=$(date +%j)
MOD_VAL=$((10#$DOY_SEQ_NO % 5))
echo "Day of Year Mod 5:" $MOD_VAL

两种方法都能将012当作十进制的12处理,得到12%5=2的正确结果。

内容的提问来源于stack exchange,提问作者zundarz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:35:16