Это не красиво, но в системе GNU / Linux вы можете циклически проходить каждый день месяца и считать:
#!/bin/bash
month="$1" # e.g. 2018-10
number="$2" # e.g. 3
weekday="$3" # e.g "Wednesday"
export LC_ALL=C TZ=UTC
date -d today > /dev/null 2>&1 || {
echo "You are not using GNU date"
exit 1
}
n="$number"
for day in {1..31}
do
wd=$(date -d "$month-$day" +"%A" 2>&1) || continue
if [[ $wd == "$weekday" ]]
then
(( --n )) || break
fi
done
if ! (( n ))
then
echo "The $weekday number $number in $month is $month-$day"
else
echo "$month does not have a $weekday number $number"
fi
Тем не менее, обратите внимание, что даты сложны, и этот простой подход может быть неправильнымучитывать различные курьезы, такие как Самоа пропускает пятницу 2011-12-30 из-за сдвига часового пояса.
Вот несколько примеров системы GNU:
$ ./finddate 2018-10 3 Wednesday
The Wednesday number 3 in 2018-10 is 2018-10-17
$ ./finddate 2018-10 5 Thursday
2018-10 does not have a Thursday number 5
Вот пример изсистема без GNU, такая как MacOS:
$ ./finddate 2018-10 3 Wednesday
You are not using GNU date