#!/bin/sh #--------------------------------------------------------------------# # Assign critical OS-based variables (if anyone knows which [gn]awk # # and where the bin dir is located, please let me know via email to # # Bob@OrlandoKuntao.com, and I'll expand the following tests). # #--------------------------------------------------------------------# OZ=`uname -s 2> /dev/null | tr '[a-z]' '[A-Z]' 2> /dev/null` if [ `expr "$OZ" : 'WINDOWS'` -ge 7 ]; then AWK=awk # Running MKS Toolkit's holidays_awk=/home/awk/holidays.awk # version of Unix on a PC holiday_file=/home/perl/holidays elif [ ."$OZ" = ."LINUX" ]; then ubin=/usr/local/bin # User bin directory AWK=gawk holidays_awk=$ubin/holidays.awk holiday_file=$ubin/holidays elif [ ."$OZ" = ."SUNOS" ]; then AWK=nawk ubin=/usr/local/bin holidays_awk=$ubin/holidays.awk holiday_file=$ubin/holidays elif [ ."$OZ" = ."HP-UX" ]; then AWK=awk ubin=/usr/local/bin fi holiday_cmd="$AWK -f $holidays_awk --" # Reduce potential typos #------------------# # Process options. # #------------------# opts="" # opt_n=0 # No holidays file gives--use default opt_v=0 # Verbose while getopts nv opt 2> /dev/null do case $opt in n ) holiday_file="";; # No holidays file gives--use default v ) opt_v=1;; * ) echo "Passing along $opt" opts="$opts -$opt" # All other opts are saved and passed ;; # on through 'set "$opts" $*' below. esac done #--------------------------------------------------------------------# # Load space-delimited holiday yyyymmdd dates into $HOLIDAYS env var.# #--------------------------------------------------------------------# echo "$holiday_cmd -s $holiday_file; export HOLIDAYS" HOLIDAYS=`$holiday_cmd -s $holiday_file`; export HOLIDAYS #--------------------------------------------------------------------# # To see if today is a holiday, simply test $HOLIDAYS (the simple # # list) as follows (most of the time, this is all you want or need): # #--------------------------------------------------------------------# today=`date +%Y""%m""%d` if [ ."`echo $HOLIDAYS | grep \`date +%Y%m%d\``" != . ]; then echo "Today is a holiday. Hoo-rah! Semper Fi. Carry on. :-)" else echo "Today's no holiday, get busy. :-((" fi #--------------------------------------------# # First Monday and last Sunday of the # # current month (you can specify year # # and month via -y and -m options). # #--------------------------------------------# echo "`$holiday_cmd -d 1.Mon $holiday_file` First Monday (Mon) this month." echo "`$holiday_cmd -d last.Sun $holiday_file` Last Sunday (Sun) this month." echo "`$holiday_cmd -d 1.1 $holiday_file` First Monday (1) this month." echo "`$holiday_cmd -d last.0 $holiday_file` Last Sunday (0) this month." echo "`$holiday_cmd -y 2025 -m 2 -d 5.1 $holiday_file` Last Monday (1) in Feb. 2025" #--------------------------------------------# # Falklands Day Light Savings Dates. # #--------------------------------------------# echo "`$holiday_cmd -d 1.0.8 -m 9` Daylight Savings Time begins" echo "`$holiday_cmd -d 1.0.6 -m 4` Return to Standard Time" #--------------------------------------------# # You can really get fancy by adding the # # holiday name with this. # #--------------------------------------------# $holiday_cmd $holiday_file | $AWK -v today=$today \ 'BEGIN {holiday=0} match($0,today) \ { holiday=1 sub(/^.*:/,"",$0) sub(/_/ ," ",$0) print "Today is "$0". Hoo-rah! :-)" exit 1 } END { if (! holiday) print "Today is no holiday, get busy. :-((" exit 0 }' #--------------------------------------------# # For complete holiday list (date, weekday, # # and holiday name), try this. # #--------------------------------------------# $holiday_cmd $holiday_file | sort \ | $AWK -v today="$today" \ '{ gsub(/:/," ",$0) gsub(/_/," ",$0) if (match($0,today)) $0 = $0"\t **HOLIDAY**" print $0 }' #--------------------------------------------# # To see if today is the 2nd business day of # # the month, you can do this. # #--------------------------------------------# bizday=`$holiday_cmd -b 2 $holiday_file` if [ `date "+%Y%m%d"` = $bizday ]; then echo "Today is the 2nd business day ($bizday) of the month." else echo "Today is NOT the 2nd business day ($bizday) of the month." fi #--------------------------------------------# # To see if today is the last business day # # of the month, you can do this. # #--------------------------------------------# bizday=`$holiday_cmd -b last $holiday_file` if [ `date "+%Y%m%d"` = $bizday ]; then echo "Today is the last business day ($bizday) of the month." else echo "Today is NOT the last business day ($bizday) of the month." fi #--------------------------------------------# # An easier way to see if today is this # # month's last business day (or any day) # # is to use the test or -t option. # #--------------------------------------------# $holiday_cmd -t -b "last" $holiday_file > /dev/null 2>&1 if [ $? -eq 1 ]; then echo "Completion status indicates today is" \ "the last business day ($bizday) of the month." else echo "Completion status indicates today is NOT" \ "the last business day ($bizday) of the month." fi #--------------------------------------------# # To see if today is the next to the last # # business day of the month, do this (you # # can also use the -t here option as well). # #--------------------------------------------# bizday=`$holiday_cmd -b -1 $holiday_file` if [ `date "+%Y%m%d"` = $bizday ]; then echo "Today is " "the next-to-the-last business day" \ "($bizday) of the month." else echo "Today is NOT the next-to-the-last business day" \ "($bizday) of the month." fi #--------------------------------------------# # See if today is a business day at all. # #--------------------------------------------# $holiday_cmd -B $holiday_file if [ $? -eq 1 ]; then echo "Today is a business day--get crackin'." else echo "Today is NOT a business day--have fun." fi #--------------------------------------------# # Display the day range for the 25 years in # # which the 5th business day might fall. # #--------------------------------------------# yys="_BEGIN_ 00 01 02 03 04 05 06 07 08 09" yys="$yys 10 11 12 13 14 15 16 17 18 19" yys="$yys 20 21 22 23 24 25 _END_" echo "\nFifth Business day falls on and between the following dates:" for yy in $yys do if [ $yy = "_BEGIN_" ]; then echo "$holiday_cmd -y 20yy -b 5 $holiday_file" days=" " elif [ $yy = "_END_" ]; then # Double echo removes newlines range=`echo \`echo $days|$AWK 'BEGIN {RS=" "}{print}'|sort\`` r1=`expr ".$range" : '\.\(..\)'.*` # First r2=`expr "$range." : '.*\(..\)\.'` # Last echo "\n5th business day falls within days $r1-$r2." else for mm in 01 02 03 04 05 06 07 08 09 10 11 12 do bizday=`$holiday_cmd -y 20$yy -m $mm -b 5 $holiday_file` echo "\r$bizday\c" # This is cool. day=`expr "$bizday" : '.*\(..\)'` if [ 0`expr " $days " : ".* $day \.*"` -eq 0 ]; then days="${days}$day " fi done fi done #--------------------------------------------# # Report first and second business days of # # every month during our test year range. # #--------------------------------------------# echo echo " First Second" echo "-------- --------" for yy in 00 01 02 03 04 05 06 07 08 09 # Years do for mm in 1 2 3 4 5 6 7 8 9 10 11 12 # Months do fst=`$holiday_cmd -y 20$yy -m $mm -b 1 $holiday_file` snd=`$holiday_cmd -y 20$yy -m $mm -b 2 $holiday_file` echo "$fst $snd" done done #--------------------------------------------# # Report next-to-last and last business days # # of every month during our test year range. # #--------------------------------------------# echo echo "Next-to Last" echo "-------- --------" for yy in 00 01 02 03 04 05 06 07 08 09 # Years do for mm in 1 2 3 4 5 6 7 8 9 10 11 12 # Months do n2l=`$holiday_cmd -y 20$yy -m $mm -b -1 $holiday_file` lst=`$holiday_cmd -y 20$yy -m $mm -b last $holiday_file` echo "$n2l $lst" done done #--------------------------------------------# # For a test that'll put hair on your chest, # # report all holidays for the 21st century. # #--------------------------------------------# if [ $opt_v -eq 1 ]; then echo for d in 0 1 2 3 4 5 6 7 8 9 # Decade do for y in 0 1 2 3 4 5 6 7 8 9 # Years do cal 20${d}${y} echo "$holiday_cmd -y 20${d}${y} 2005 -m 2 -d last.5 $holiday_file" $holiday_cmd -y 20${d}${y} 2005 -m 2 -d last.5 $holiday_file echo "$holiday_cmd -y 20${d}${y} $holiday_file | sort" $holiday_cmd -y 20${d}${y} $holiday_file | sort echo done done fi