A couple of readers, upon reading this article to calculate yesterday’s date in a shell script, have requested for a similar script that can be used to calculate tomorrow’s date.
Even though such a script is quite straight forward to write, many people seem to be have problem with the leap year calculations. Anyway, I have managed to come up with a script to help everyone. Read on.
If you are running Linux, it’s highly likely that you have a GNU version of the date
command installed. With GNU date, you can get tomorrow’s date quite easily (without the help of any shell script) by running it as follows:
1 2 |
$ date -d "+1 day" Thu Oct 8 06:26:25 PDT 2009 |
If you are running a commercial UNIX distribution instead of Linux, chances are that the date command will not support the ‘-d’ option. The script below can be used on such platforms to calculate tomorrow’s date instead. Save the following script to a file called tomorrow, chmod to 755 and copy it to a directory in your PATH.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#!/bin/sh # # Script to calculate tomorrow's date with custom output date format # # Author: ibrahim - stackpointer.io # # default output format, change as necessary defaultof="%Y%m%d" # check for input format, else use default format, # refer to 'man date' for help on format # script only supports %Y %m %d at the moment of=$defaultof [ $# -eq 1 ] && of="$1" # get today's date eval "`date +'y=%Y m=%m d=%d'`" #check for max number of days in current month days=31 if [ $m -eq 4 ] || [ $m -eq 6 ] || [ $m -eq 9 ] || [ $m -eq 11 ] ; then days=30 fi # check for leap year if feb if [ $m -eq 2 ]; then days=28 leap1=`expr $y % 4` leap2=`expr $y % 100` leap3=`expr $y % 400` if [ $leap1 -eq 0 ] ; then if [ $leap2 -gt 0 ] || [ $leap3 -eq 0 ] ; then days=29 fi fi fi # increment date if [ $d -eq $days ]; then d=1 m=`expr $m + 1` if [ $m -eq 13 ]; then m=1 y=`expr $y + 1` fi else d=`expr $d + 1` fi #Solaris date does not accept -d #date -d "$y-$m-$d" +"$of" eval "y=`expr $y + 0` m=`expr $m + 0` d=`expr $d + 0`" eval "y=`printf "%04d" $y` m=`printf "%02d" $m` d=`printf "%02d" $d`" echo "$of" | sed -e "s/%Y/$y/" -e s/%m"/$m/" -e "s/%d/$d/" |
Below are some examples on how the script can be called.
1 2 3 4 5 6 7 8 9 10 11 |
$ date Wed Oct 7 06:36:45 PDT 2009 $ tomorrow 20091008 $ tomorrow "prefix %Y-%m-%d postfix" prefix 2009-10-08 postfix $ tomorrow "%Y-%m-%d" 2009-10-08 |
Update (09-Nov-2010): Script modified to run on Solaris platforms
Update (07-Aug-2011): Script updated to prevent printf function from interpreting certain numbers as octal