У меня что-то похожее работает на машине с Linux (Ubuntu 8.10). Я не думаю, что это будет работать с Solaris, одна машина, которую я тестировал, не позволяла использовать символ _ после%, чтобы избежать заполнения поля нулем. Незаполнение позволяет дате возвращать 1 вместо 01 (01 не выглядишь правее против 1-го).
Я использую функцию оболочки (опять же, ваша ОС или версия оболочки может не понравиться, как я определил функцию) с именем DaySuffix, а затем вызываю эту функцию как часть вызова даты. Сам по себе функционал довольно хакерский, я уверен, что есть лучший способ сделать это, но он работает для меня. Обратите внимание на особые случаи для 11, 12 и 13 - вы должны любить английский язык!
#!/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"