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

