I would like to give an extended answer for a slightly different format, but this can easily be changed to the dd/mm/YY format with the answers already given; it's tested on busybox (posix shell)
This is one of the first hits for web searches similar to "busybox posix shell script date" and "test format" or "validate" etc, so here my solution for busybox (tested with 1.29.3, 1.23.1)
#!/bin/sh ########## # # check if date valid in busybox # tested in busybox 1.29.3, 1.23.1 # # call with: # $0 <yyyymmdd> # ########## mydate=$1 if echo $mydate | grep -qE '20[0-9][0-9](0[1-9]|1[0-2])([012][0-9]|3[01])'; then printf 'may be valid\n' date +%Y%m%d -d $mydate -D %Y%m%d > /dev/null 2>&1 is_valid=$? if [ $is_valid -ne 0 ]; then printf 'not valid\n' return 1 else mytestdate=$(date +%Y%m%d -d $mydate -D %Y%m%d) if [ $mydate -ne $mytestdate ]; then printf 'not valid, results in "%s"\n' "$mytestdate" return 1 else printf 'valid\n' fi fi else printf 'not valid (must be: <yyyymmdd>)\n' return 1 fi
as in busybox (1.29.3 & 1.23.1) you have responds like:
lxsys:~# date +%Y%m%d -d 20110229 -D "%Y%m%d" 20110301
I had the need to validate the date in some better way but i wanted to rely mostly on the system itself
so with
mytestdate=$(date +%Y%m%d -d $mydate -D %Y%m%d) if [ $mydate -ne $mytestdate ]; then ... fi
there is a second test - do we have a difference between the wanted or given format (input, $mydate) and the system interpretation (output, $mytestdate) of it ... if it's not the same, discard the date