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

Shell脚本操作日期失败:特定日期运行报错的修复咨询

MySQL分区管理Shell脚本日期解析问题修复

原脚本用于MySQL分区管理,逻辑为新增下个月分区、删除上个月分区,通过计算时间戳确定分区阈值。但在每月8号、9号运行时会失败,报错信息如下:

line 11: 08: value too great for base (error token is "08")
Warning: 使用命令行界面输入密码存在安全风险。

问题原因

bash中,以0开头的数字会被解析为八进制数,而八进制数仅包含0-7。当date +"%d"返回带前导零的日期(如08、09)时,执行$(($(date +"%d")-1))会触发八进制解析错误——因为08不是合法的八进制数值。

修复方案

核心是避免bash对带前导零的日期进行八进制解析,以下是两种可靠修复方式:

方式1:强制十进制解析日期

在日期算术运算时,通过10#前缀强制bash以十进制解析带前导零的日期:

PARTITION=`date --date="+2 month -$((10#$(date +"%d")-1)) days 00:00:00" +"%s"`

方式2:直接用date命令生成目标时间(更简洁)

绕开手动日期算术运算,直接让date命令计算下下个月1号0点的时间戳(和原脚本逻辑完全一致):

PARTITION=$(date --date="$(date +'%Y-%m-01') +2 months" +"%s")

修改后的完整脚本

推荐使用方式2,代码更简洁且彻底避免解析问题:

#!/bin/sh

declare -i r_code=0                     # 初始化脚本返回码

cd /opt/software/dbascripts
# dbbkp.auth文件存储数据库用户名和密码
source ../dbaauthfiles/dbbkp.auth

NEW=$(date +"%Y%m" --date="next month")
OLD=$(date +"%Y%m" --date="last month")
# 直接计算下下个月1号0点的时间戳,无需手动日期运算
PARTITION=$(date --date="$(date +'%Y-%m-01') +2 months" +"%s")

echo "$PARTITION"
echo "创建分区p$NEW并删除分区p$OLD"

mysql --batch -u"$DB_USER" -p"$DB_PASSWORD" db -f << eof
ALTER TABLE table1 ADD PARTITION ( PARTITION p$NEW VALUES LESS THAN ($PARTITION));
ALTER TABLE table1 DROP PARTITION p$OLD ;
eof
r_code+=$?

echo "### 脚本${0##*/}执行完成,返回码为$r_code"
exit $r_code

额外优化说明

  • 将反引号`替换为$(),这是bash中更推荐的命令替换写法,可读性更强且嵌套更灵活。
  • 给$DB_USER和$DB_PASSWORD添加双引号,避免变量值含特殊字符时出现解析异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:23:25