James H. H. Lampert:
    
    
      Could it be that cron is running it an entirely
        different shell, that doesn't understand the if
        statement?
      
    
    Despite what others have said, the answer to this question is
      no.  Whilst you are running two different shells, the
      problem is not the if statement.  Both of those
      shells understand that if statement.  The difference
      between the shells involves the fact that you have assumed a
      particular exit status for the cd command for
      non-existent directories.  That's the exit status that the cd
      command results in, in one of your shells.  But it is not the exit
      status that results in the other.
    Ironically, you are using the [ command anyway,
      and that command has a direct method, its -d
      operator, for testing for the non-existence of a directory.  So
      you are going around the houses a bit in order to achieve what you
      could be achieving directly, and portably (without assumptions
      about exit statuses), with the [ command itself.