Usando bash
(ou ksh93
) e 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
O formato %a
fornecerá o dia abreviado da semana na localidade atual, enquanto %e
fornecerá o dia do mês como um inteiro.
Resultado (separado por separadores):
Tue Wed Thu Fri Sat Sun Mon Tue
7 8 9 10 11 12 13 14
UPDATE para ksh93
depois dos comentários: (observe que isso não funciona, já que o shell não parece verificar as datas corretamente)
#!/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
é o primeiro definido para o ano e o mês atuais no formato YYYYMM
. Em seguida, faço loop em todos os dias da semana deste mês. O loop define wday
como o dia da semana abreviado e termina quando tento obter o dia da semana de uma data inválida.
O segundo loop apenas imprime inteiros, tantos quantos precisarmos preencher o mês.
Saída para fevereiro de 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
Solução usando ksh93
com Perl e 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