#!/bin/bash # Scakko function math { BASE=$1 ARG=$2 FORMAT="+%a %b %d %Y" OP=`echo $ARG | awk 'BEGIN{FS="[0-9]+"}{print $1}'` UN=`echo $ARG | awk 'BEGIN{FS="[0-9]+"}{print $2}'` NUM=`echo $ARG | awk 'BEGIN{FS="([\+\-]+)|([DWMY]+)"}{print $2}'` if [[ (( $OP == "" )) || (( $UN == "" )) || (( $NUM == "" )) ]]; then echo "Error: \"$ARG\" is not a valid operation string" exit 1 fi FACT=`expr $NUM \* $[$UN]` RES=`expr $BASE $OP $FACT` date -d @$RES "$FORMAT" } E_BADARGS=65 s=1 m=`expr 60 \* $s` h=`expr 60 \* $m` D=`expr 24 \* $h` W=`expr 7 \* $D` M=`expr 30 \* $D` Y=`expr 365 \* $D` today_=`date +%D` today=`date +%s -d $today_` yesterday=`expr $today - $D` tomorrow=`expr $today + $D` case "$#" in 1) BASE=$today math $BASE $1 ;; 2) case "$1" in today) BASE=$today ;; yesterday) BASE=$yesterday ;; tomorrow) BASE=$tomorrow ;; *) BASE=`date -d $1 +%s 2> /dev/null` RC=$? if [ $RC -ne 0 ]; then echo "Error: \"$1\" is not a valid date" exit $RC fi ;; esac math $BASE $2 ;; *) echo "Usage: `basename $0` [yesterday|today|tomorrow|] [+|-][D|W|M|Y]" echo "" echo "Examples:" echo " `basename $0` +1M" echo " `basename $0` MM/DD/YYYY -1W" echo " `basename $0` yesterday +2D" echo "" exit $E_BADARGS ;; esac