bash dateコマンドで○日前の日付を変数を使って求めたい

○日前の日付

date
Fri Mar 31 14:00:33 JST 2023

dateコマンド。
サーバの時間が合っているか確認する時は、これでOKですがShell Scriptで使う際はフォーマットを指定する場合がほとんどだと思います。

フォーマットを指定する

date +%Y%m%d
20230331

年月日を指定する。

10日前

date +%Y%m%d -d ’10 days ago’
20230321

10日前の “10” 部分を変数で指定したい。

トライ&エラー

day=10 && date +%Y%m%d -d ‘$day days ago’
date: invalid date ‘$day days ago’
day=10 && date +%Y%m%d -d $day ‘days ago’
date: extra operand ‘days ago’
Try ‘date --help’ for more information.
day=10 && date +%Y%m%d -d $day’days ago’
20230321

正解は変数$dayの後にスペースが不要でした。
2日前以上の場合、単数形の’day ago’でも動作します。

応用

MySQLサーバで動作しているZABBIX ServerのDBバックアップ(mysqldump)をcronスケジュールで行っているのですが、貯まったバックアップを一定期間保存した後自動削除するスクリプトを書きました。

cat delete_dump.sh
.#!/bin/bash
DIR=/backup
PERIOD_FOR_SAVE=14
DELETE_BEFORE=`expr $PERIOD_FOR_SAVE + 1`
echo $DELETE_BEFORE
DELETE_DAY=`/usr/bin/date +%Y%m%d --date $DELETE_BEFORE’days ago’`
echo $DELETE_DAY
DELETE_FILE=zabbix-server_backup_$DELETE_DAY*
echo $DELETE_FILE
DELETE_PATH=$DIR/$DELETE_FILE
echo $DELETE_PATH
/usr/bin/rm -f $DELETE_PATH
TwitterFacebookLinkedInHatenaPocketCopy Link