Cover V02, I04
Article
Listing 1
Listing 2
Sidebar 1

jul93.tar


Listing 2: weekdate script

#!/bin/sh
#
#       weekdate
#
#       Outputs the day of the current month
#       corresponding with the arguments of the form
#       "2 Sun" where 2 is the 2nd and Sun is Sunday.
#       The first argument may be any number from 1
#       to 5 and the second may be any three-letter
#       day of the week or a number from 0 to 6 (Sun
#       to Sat).
#
#       For use with cron, it is better to output a
#       status if the current day is the specified
#       weekdate of the month.  Using this method
#       allows commands such as
#
#               weekdate 2 Tue && dosomething
#
#       to be put into a crontab line executed
#       sometime every Tuesday, or
#
#               weekdate 4 Thu || dosomething
#
#       to execute something every Thursday except
#       the 4th one.
#
#       Copyright, Jan 12, 1993 by Lawrence S Reznick

usage () {
echo $0: $1 \\n
echo usage: $0 whichone whichday \\n
echo where whichone is a number 1-5
echo and whichday is a day of the week name or number:
echo sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6 \\n
echo Give day number corresponding with the requested weekdate,
echo such as second Tuesday by \"weekdate 2 tue\".
}

#
# Extract the day's column from the calendar.
# The extra date command after cal makes SCO compatible with SVR4.
# If using SVR4, it can be taken out.
#

calprog () {
cal `date '+%m %Y'`
}

daycolumn () {
calprog |
tail +3 |
cut -c$1
}

#
# Check arguments

#

if [ $# -lt 2 ]
then
usage "Missing arguments"
exit 1
fi

whichone=$1
whichday=$2

if [ $whichone -lt 1 -o $whichone -gt 5 ]
then
usage "First parameter out of range"
exit 1
fi

#
# Allow day of week to be number or case independent word abbreviation
#

sun=0; mon=1; tue=2; wed=3; thu=4; fri=5; sat=6

whichday=`echo $whichday | tr '[A-Z]' '[a-z]'`

case $whichday in
0 | 1 | 2 | 3 | 4 | 5 | 6 )
;;

sun | mon | tue | wed | thu | fri | sat )
whichday=`eval echo $"$whichday"`
;;

* )
usage "Second parameter \"$whichday\" out of range"
exit 1
;;
esac

#
# Set a field range of characters for cutting the day number out of cal
#

field=`expr $whichday \* 3`
field=`expr 1 + $field`-`expr 2 + $field`

if [ $whichone -eq 5 -a `daycolumn $field | wc -w` -lt 5 ]
then
echo "$0: Second parameter is a 5th day not in this month \n"
echo "Command was \"$0 $1 $2\" for the following month: \n"
calprog
exit 2
fi

#
# Figure out which day of the week was the first day of the month
#

firstday=`calprog | tail +3 | head -1 | wc -w`
firstday=`expr 7 - $firstday`

#
# If the day requested comes before the first day, start search in 2nd week
#

if [ $whichday -lt $firstday ]
then
whichone=`expr $whichone + 1`
fi

#
# Figure out which day of the month is the day requested
#

day=`daycolumn $field | tail +$whichone | head -1`

# Set the exit status according to whether today is that day of the month
# If you'd rather output the day number, uncomment the next line and
# comment the test line.
#echo $day
#test $day -eq `date '+%d'`