SunOS 6.8环境bash脚本如何正确获取上周日期访问备份目录
老版本System V分支的date工具(包括你环境里SunOS 6.8自带的8.5版本date)对TZ时区偏移有硬限制:仅支持最大±144小时(即前后6天)的偏移计算,超过阈值后会直接回退到当前系统时区返回时间,这就是TZ=GMT+168拿不到7天前日期、直接返回当日日期的根本原因,没法通过调整TZ参数直接绕开这个限制。
以下是适配你当前环境的可行方案,按兼容性优先级排序:
方案1:Perl one-liner计算(零额外依赖,最稳妥)
老版本SunOS默认预装Perl运行环境,不需要额外安装任何软件包,直接调用POSIX标准日期模块计算即可,不受date工具的版本限制,也不会受夏令时、闰秒等场景的偏移误差影响:# 计算7天前日期,输出格式为ddmmyyyy,和你现有备份文件夹命名规则完全匹配 last_week_date=$(perl -MPOSIX -e 'print strftime("%d%m%Y", localtime(time - 7*24*3600))')拿到变量后直接拼接路径即可,例如备份文件夹路径为
backup_${last_week_date}。方案2:嵌套TZ偏移调用(无额外依赖,适合不能调用Perl的极端场景)
既然单次TZ偏移最大支持往前6天,可以分两次偏移凑够7天:第一次偏移144小时拿到6天前的日期,再基于该日期偏移24小时拿到7天前的结果。注意这个方案需要你的date支持-d参数传入指定日期:last_week_date=$(TZ=GMT+144 date +%d%m%Y | xargs -I {} TZ=GMT+24 date -d {} +%d%m%Y)方案3:GNU date调用(适合已安装GNU coreutils的环境)
如果你的环境已经安装了GNU版日期工具(通常命令名为gdate),可以直接用其原生相对日期语法,写法最简洁:last_week_date=$(gdate -d "7 days ago" +%d%m%Y)注意SunOS原生自带的date不支持
-d传相对日期的语法,不要直接用原生date执行该命令。
你之前用TZ=GMT+24获取昨日日期的写法存在隐藏风险:在夏令时切换、闰秒调整的日期会出现1小时级的误差,可能导致匹配不到正确的备份文件夹,长期运行备份脚本建议优先使用Perl或GNU date的计算方案。
内容的提问来源于stack exchange,提问作者Mohamed Douzi

