I have something similar working on a Linux machine (Ubuntu 8.10). I don't think it will work with Solaris, the one machine I tested did not allow using a _ character following the % to avoid padding the field with a 0. The non-padding allows date to return 1 instead of 01 (01st doesn't look right versus 1st).
I use a shell function (again, your OS or shell version may not like the way I defined the function) named DaySuffix, then call that func as part of the date call. The func itself is fairly hacky, I'm sure there is a better way to do this but it works for me. Note the special cases for 11, 12, & 13 - you've got to love the English language!
#!/bin/sh DaySuffix() { if [ "x`date +%-d | cut -c2`x" = "xx" ] then DayNum=`date +%-d` else DayNum=`date +%-d | cut -c2` fi CheckSpecialCase=`date +%-d` case $DayNum in 0 ) echo "th" ;; 1 ) if [ "$CheckSpecialCase" = "11" ] then echo "th" else echo "st" fi ;; 2 ) if [ "$CheckSpecialCase" = "12" ] then echo "th" else echo "nd" fi ;; 3 ) if [ "$CheckSpecialCase" = "13" ] then echo "th" else echo "rd" fi ;; [4-9] ) echo "th" ;; * ) return 1 ;; esac } # Using consolidated date command from chris_l # Also using %-d instead of %d so it doesn't pad with 0's date "+%A %-d`DaySuffix` %B %Y"