A maneira mais fácil é converter a data em um valor unix time_t (ou seja, segundos desde o início da época, ou '1-1-1970 00:00:00') e, em seguida, subtrair 30 dias * 86400 segundos por dia a partir desse número.
por exemplo. o exemplo a seguir usa set -x
para que você possa ver o valor da variável D conforme ela é alterada.
#! /bin/ksh
set -x
D=$(date -d '2013-10-13' '+%s')
D=$((D - 30 * 86400))
date -d "@$D"
Note que isto depende da versão GNU de date
, do GNU Coreutils. Outras versões da data podem não suportar a conversão de um valor time_t de volta para uma data formatada com @
. A menos que você tenha instalado o GNU coreutils, isso provavelmente não está disponível em seu sistema AIX, então gawk
é provavelmente sua melhor opção para converter de volta para uma data formatada:
echo "$D" | gawk '{print strftime("%c", $0)}'
minha resposta original aqui sugeriu o plain awk, mas testes adicionais no meu sistema debian revelaram que nem mawk
nem original-awk
tem a função strftime
embutida, então você terá que instalar o GNU Coreutils ou GNU Awk.
Se o perl estiver instalado no sistema, o perl pode ser usado em vez do awk:
echo $D | perl -nE 'say scalar gmtime $_'
Existem vários métodos alternativos e exemplos de como fazer isso: