A "n semanas após uma data" é fácil com a data GNU (1):
$ date -d 'now + 3 weeks'
Tue Dec 6 23:58:04 EST 2011
$ date -d 'Aug 4 + 3 weeks'
Thu Aug 25 00:00:00 EST 2011
$ date -d 'Jan 1 1982 + 11 weeks'
Fri Mar 19 00:00:00 EST 1982
Eu não sei de uma maneira simples de calcular a diferença entre duas datas, mas você pode envolver uma pequena lógica em volta da data (1) com uma função de shell.
datediff() {
d1=$(date -d "$1" +%s)
d2=$(date -d "$2" +%s)
echo $(( (d1 - d2) / 86400 )) days
}
$ datediff '1 Nov' '1 Aug'
91 days
Troque d1
e d2
se você quiser o cálculo da data da outra maneira, ou seja um pouco mais extravagante para fazer isso não importa. Além disso, caso haja uma transição não-DST para DST no intervalo, um dos dias será de apenas 23 horas longo; você pode compensar adicionando ½ dia à soma.
echo $(( (((d1-d2) > 0 ? (d1-d2) : (d2-d1)) + 43200) / 86400 )) days