Bash脚本中date +%j运算报错:value too great for base问题求助
Bash日期计算报错解决:"value too great for base"
错误原因
你用date +%j获取的是一年中的第几天,返回结果是带前导零的三位数(比如089)。Bash的算术扩展$((...))会把开头带0的数字默认解析为八进制数,但八进制里只有0-7这几个数字,所以包含8或9的数值就会触发"value too great for base"错误。
解决方案
方法1:强制按十进制解析数字
在算术计算时,用10#前缀指定数字为十进制,不管有没有前导零都能正确计算:
today=$(date +%j) # run every monday echo "$today" limit="$((10#$today - 30))" echo "$limit"
方法2:让date直接计算N天前的日期(更健壮)
如果你的核心需求是获取30天前的日期,没必要自己计算天数差,直接用date命令的日期偏移功能,还能自动处理跨年、月份天数不同的情况:
# 获取30天前的一年中的第几天(不带前导零) limit_day=$(date -d "30 days ago" +%j) echo "$limit_day"
如果需要进一步计算,同样可以用10#确保十进制解析:
limit="$((10#$limit_day))"
额外建议:直接用find筛选文件
如果最终是要查找30天内的文件,直接用find命令更高效,不用手动处理日期计算:
# 查找当前目录及子目录下,30天内修改过的文件 find . -type f -mtime -30
内容的提问来源于stack exchange,提问作者euge1780
相关产品推荐
相关产品推荐

