Code creates day 32 instead of 1st day of next month.

I am using the code below modified from a post I saw here regarding having the script write out future dates. The problem is that instead of making 8/1 it makes 7/32! Please help!


yy=`date +%Y`
mm=`date +%m`
dd=`date +%d`

echo "Today is : $yy $mm $dd"


#!/usr/bin/ksh

date '+%m %d %Y' | 
{ 
read m d Y
d=`expr "$d" + 1` 
case "$d" in 
        0) 
           m=`expr "$m" + 1` 
                case "$m" in 
                        0) 
                           m=12 
                           Y=`expr "$Y" + 1` 
                        ;; 
                esac 
        d=`cal $m $Y | grep . | fmt +1 | tail +1` 
esac 

echo "Tomorrow is : $m $d $Y" 



d=`expr "$d" + 1` 
case "$d" in 
        0) 
           M=`expr "$m" + 1` 
                case "$m" in 
                        0) 
                           m=12 
                           Y=`expr "$Y" + 1` 
                        ;; 
                esac 
        d=`cal $m $Y | grep . | fmt +1 | tail +1` 
esac 

echo "The day after tomorrow is : $Y$m$d"



d=`expr "$d" + 1` 
case "$d" in 
        0) 
           M=`expr "$m" + 1` 
                case "$m" in 
                        0) 
                           m=12 
                           Y=`expr "$Y" + 1` 
                        ;; 
                esac 
        d=`cal $m $Y | grep . | fmt +1 | tail +1` 
esac 

echo "Two days from today is : $Y$m$d"


}
exit

The code is clearly a bad adaptation of a clever script to calculate yesterday's date.
It basically it would work for yesterday's date with:

d=`expr "$d" - 1`
m=`expr "$m" - 1` 
Y=`expr "$Y" - 1`

But it does not work for tomorrow's date with:

d=`expr "$d" + 1`
m=`expr "$m" + 1` 
Y=`expr "$Y" + 1`

Btw. I get a syntax error with "fmt -1" .
What Operating System and Shell are you using?

There may be better ways to do this depending on what Operating System and Shell you have.

As it stands the script is repairable by changing the logic to suite future dates.
The script contains a method for finding the last day of the month from the output of unix "cal". You'd need to determine whether the day in question is the last day of this month before deciding how to increment day month and year.

Ok. How exactly would I do that? I am using a C shell. Is there a way to read tomorrows date or have it print on the screen with perhaps the cal function? I could possibly use the cut command print the day. If not, how would I "change the logic to suite future dates?"

---------- Post updated at 07:44 AM ---------- Previous update was at 07:42 AM ----------

I am actually running a program that runs out 60 hours so I would need to be able to write the dates for as long as 2 days after tomorrow.

---------- Post updated at 08:34 AM ---------- Previous update was at 07:44 AM ----------

Would it be possible to use the +1 with a -j command to get the number of the day of year then convert the modified julian date back into the standard date?

---------- Post updated at 09:21 AM ---------- Previous update was at 08:34 AM ----------

Ok I found a pretty simple way to do it but I still need to have the month written numerically. How could I do it in conjuction with this command?

date -d "+2 day"

---------- Post updated at 09:30 AM ---------- Previous update was at 09:21 AM ----------

I figured it out! I can simply do this

date -d "+3 day" +%y%m%d

I'm sure that in your next post you will mention what Operating System you have and what Shell you are using.
The script posted in post #1 was clearly not "C shell".
The extended "date" functions are not available in standard unix, so we guess that you are running some sort of Linux.

Looks like the Korn shell

---------- Post updated at 01:06 PM ---------- Previous update was at 12:45 PM ----------

If on Linux, ksh is probably actually ksh93. In that case you can do

$ printf "%T\n"  today
Mon Aug  2 00:00:00 EDT 2010
$ printf "%T\n"  "today + 1 day"
Tue Aug  3 00:00:00 EDT 2010
$ printf "%T\n"  "today + 2 day"
Wed Aug  4 00:00:00 EDT 2010
$

I am running on a Linux Box.

[rhuff@huina working]$ echo $SHELL
/bin/csh

---------- Post updated at 12:01 PM ---------- Previous update was at 11:56 AM ----------

My script worked for the date. the kshell script was partially borrowed script from an earlier project which I have had to modify. The line

#!/usr/bin/ksh

is a dead line. In any case, I have a running Cronjob twice daily. I want to add a line to the script that searches for a file. If the file does not exist, I need to kill the job and run it again in one hour. I am running the program and 2 am and 2pm. I would want the job to run again at 3am and 3pm respectively. How could I do this and still keep the cronjob running twice daily if I killed it once?