Você provavelmente não queria restringi-lo ao bash, mas... você poderia.
Usando apenas o bash, mas o bash 4.2 ou mais recente (para suportar printf %(fmt)T), e assumindo apenas o número de segundos em um dia (embora deva ser seguro para segundos bissextos):
#!/bin/bash
now=$(printf '%(%s)T' -1)
thism=$(printf '%(%B)T' "$now")
nextm=$thism
s=$now
until [[ "$thism" != "$nextm" ]]
do
s=$((s+86400))
nextm=$(printf '%(%B)T' "$s")
done
printf '%(%B)T\n' "$s"
while [[ "$thism" != "$(printf '%(%B)T' "$s")" ]]
do
while [[ "$(printf '%(%B)T' "$s")" == "$(printf '%(%B)T' $((s + 86400)))" ]]
do
s=$((s+86400))
done
s=$((s+86400))
printf '%(%B)T\n' "$s"
done
As atribuições iniciais configuram a hora atual em segundos e o mês atual; uma variável "este mês" é inicializada com o mês atual e uma variável "segundos" é inicializada com a hora atual em segundos.
O primeiro loop nos tira do mês atual incrementando a variável "seconds" por um dia de segundos. Quando terminarmos o mês atual, imprima o nome do novo mês.
O segundo loop percorre o ano até encontrarmos o mês atual novamente; o loop interno dentro desse loop incrementa os "segundos" até o último dia do mês. Uma vez que o loop interno é feito, incrementamos um dia e então imprimimos o nome do novo mês. O loop externo (segundo) é retomado até a conclusão.
Usando a expressão de sequência do bash e o loop for para iterar o comando GNU coreutilsdate durante os 12 meses:
months()
{
for i in {1..12};
do date +%B -d "$i/01/1980" ;
done ;
}
irá gerar a monthsfunção shell que produzirá o nome alfabético completo de 12 meses cronologicamente linha por linha.
Explicação: Estamos solicitando ao datecomando que produza o nome alfabético completo de um mês (+%B), apenas para as datas que especificarmos (-d); no nosso caso, iterando pelos 12 meses por sua representação numérica gerada pela expressão de sequência do bash.
Nota: O que está depois do $i na string de data só é necessário para informar datea função do iterável definindo sua posição relativa, portanto, o dia e o ano neste trecho ( ou seja, 01/1980 ) foram escolhidos arbitrariamente.
locale
informará os nomes dos meses na localidade atual:Desta forma:
Se você quiser os meses em linhas separadas, canalize a saída para
tr ';' '\n'
.Embora preferindo a
locale
proposta, assumindo a implementação GNU dedate
, esta seria executadadate
apenas uma vez em vez de 12 vezes:Você provavelmente não queria restringi-lo ao bash, mas... você poderia.
Usando apenas o bash, mas o bash 4.2 ou mais recente (para suportar
printf %(fmt)T
), e assumindo apenas o número de segundos em um dia (embora deva ser seguro para segundos bissextos):As atribuições iniciais configuram a hora atual em segundos e o mês atual; uma variável "este mês" é inicializada com o mês atual e uma variável "segundos" é inicializada com a hora atual em segundos.
O primeiro loop nos tira do mês atual incrementando a variável "seconds" por um dia de segundos. Quando terminarmos o mês atual, imprima o nome do novo mês.
O segundo loop percorre o ano até encontrarmos o mês atual novamente; o loop interno dentro desse loop incrementa os "segundos" até o último dia do mês. Uma vez que o loop interno é feito, incrementamos um dia e então imprimimos o nome do novo mês. O loop externo (segundo) é retomado até a conclusão.
Com a implementação do FreeBSD
date
(aquela também encontrada nos macos):Usando a expressão de sequência do bash e o loop for para iterar o comando GNU coreutils
date
durante os 12 meses:irá gerar a
months
função shell que produzirá o nome alfabético completo de 12 meses cronologicamente linha por linha.Explicação: Estamos solicitando ao
date
comando que produza o nome alfabético completo de um mês (+%B), apenas para as datas que especificarmos (-d); no nosso caso, iterando pelos 12 meses por sua representação numérica gerada pela expressão de sequência do bash.Nota: O que está depois do $i na string de data só é necessário para informar
date
a função do iterável definindo sua posição relativa, portanto, o dia e o ano neste trecho ( ou seja, 01/1980 ) foram escolhidos arbitrariamente.