Использование bash
(или ksh93
), и GNU date
:
for (( i = 0; i < 8; ++i )); do
printf '%s\t' "$( date -d "now +$i days" +"%a" )"
done
echo
for (( i = 0; i < 8; ++i )); do
printf ' %d\t' "$( date -d "now +$i days" +"%e" )"
done
echo
Формат % a
даст вам сокращенный день недели в текущей локали, а % e
даст вам день месяц как целое число.
Результат (разделенные табуляцией):
Tue Wed Thu Fri Sat Sun Mon Tue
7 8 9 10 11 12 13 14
ОБНОВЛЕНИЕ для ksh93
после комментариев: (обратите внимание, это не работает, поскольку оболочка не проверяет даты должным образом)
#!/bin/ksh93
yearmonth=$( date +"%Y%m" )
d=1
while printf '%(%a)T\t' "$( printf '%s%02d' "$yearmonth" "$d" )" 2>/dev/null
do
(( ++d ))
done
echo
days_this_month=$(( --d ))
while (( d > 0 )); do
printf ' %d\t' "$(( days_this_month - (--d) ))"
done
echo
yearmonth
сначала устанавливается текущий год и месяц в формате YYYYMM
. Затем я перебираю все будние дни этого месяца. Цикл устанавливает wday
как сокращенный день недели, и он завершается, когда я пытаюсь получить день недели для недействительной даты.
Второй цикл просто печатает целые числа, столько, сколько нам нужно, чтобы заполнить месяц.
Вывод за февраль 2017 г .:
Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
Решение с использованием ksh93
с Perl и Date :: Calc :
#!/bin/ksh93
ym=( $(date +"%Y %m") )
days=$( perl -MDate::Calc -e 'print Date::Calc::Days_in_Month($ARGV[0],$ARGV[1])' -- "${ym[0]}" "${ym[1]}" )
for d in {1..$days}; do
printf '%(%a)T\t' "$( printf '%d-%d-%02d' "${ym[@]}" "$d" )"
done
echo
for d in {1..$days}; do
printf '%d\t' "$d"
done
echo