如何在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
相关产品推荐
相关产品推荐

