A sabedoria usual é usar o 15 deste mês. Então subtraia 1 mês:
$ nowmonth=$(date +%Y-%m)
$ date -d "$nowmonth-15 last month" '+%Y%m'
201602
No Linux, posso conseguir no mês passado usando
date -d "last month" '+%Y%m'
ou
date -d "1 month ago" '+%Y%m'
Mas digamos, hoje é 31 de março, se eu executar o comando no topo, ele mostra 201603, mas eu quero obter o mês passado, independentemente do dia em que estou agora; como posso fazer isso?
Eu posso conseguir isso usando uma solução alternativa como obter o primeiro dia / último dia do mês anterior, mas eu me pergunto se existe alguma maneira elegante de fazer isso?
date -d "-$(date +%d) days" '+%Y%m' #get last day of previous month
GNU date
não é particularmente adequado para aritmética como você pretende. Essa é uma das razões pelas quais eu escrevi dateutils
.
Seu exemplo se resumiria a:
$ dateadd today -1mo -f '%Y%m'
201603
E faz a coisa certa no dia 31 de março:
$ dateadd 2016-03-31 -1mo -f '%Y%m'
201602
Ou o que você insinua em seu comentário (recebendo o último dia do mês anterior), independentemente da data de hoje:
$ dateround --next today -31d
2016-03-31
$ dateround --next 2016-03-31 -31d
2016-02-29