date --date='1 days ago' '+%a'
Ce n'est pas une solution très compatible. Cela ne fonctionnera que sous Linux. Du moins, cela n'a pas fonctionné sous Aix et Solaris.
Cela fonctionne dans RHEL :
date --date='1 days ago' '+%Y%m%d'
20080807
J'ai besoin de faire de l'arithmétique de date dans des scripts shell Unix que j'utilise pour contrôler l'exécution de programmes tiers.
J'utilise une fonction pour incrémenter un jour et une autre pour décrémenter :
IncrementaDia(){
echo $1 | awk '
BEGIN {
diasDelMes[1] = 31
diasDelMes[2] = 28
diasDelMes[3] = 31
diasDelMes[4] = 30
diasDelMes[5] = 31
diasDelMes[6] = 30
diasDelMes[7] = 31
diasDelMes[8] = 31
diasDelMes[9] = 30
diasDelMes[10] = 31
diasDelMes[11] = 30
diasDelMes[12] = 31
}
{
anio=substr($1,1,4)
mes=substr($1,5,2)
dia=substr($1,7,2)
if((anio % 4 == 0 && anio % 100 != 0) || anio % 400 == 0)
{
diasDelMes[2] = 29;
}
if( dia == diasDelMes[int(mes)] ) {
if( int(mes) == 12 ) {
anio = anio + 1
mes = 1
dia = 1
} else {
mes = mes + 1
dia = 1
}
} else {
dia = dia + 1
}
}
END {
printf('%04d%02d%02d', anio, mes, dia)
}
'
}
if [ $# -eq 1 ]; then
tomorrow=$1
else
today=$(date +'%Y%m%d')
tomorrow=$(IncrementaDia $hoy)
fi
mais maintenant je dois faire des calculs plus complexes.
Quelle est la meilleure façon et la plus compatible de procéder ?
date --date='1 days ago' '+%a'
Ce n'est pas une solution très compatible. Cela ne fonctionnera que sous Linux. Du moins, cela n'a pas fonctionné sous Aix et Solaris.
Cela fonctionne dans RHEL :
date --date='1 days ago' '+%Y%m%d'
20080807
Pourquoi ne pas écrire vos scripts en utilisant un langage comme perl ou python qui supporte plus naturellement le traitement complexe des dates ? Bien sûr, vous pouvez tout faire en bash, mais je pense que vous obtiendrez également plus de cohérence entre les plates-formes en utilisant python par exemple, tant que vous pouvez vous assurer que perl ou python est installé.
Je dois ajouter qu'il est assez facile de câbler des scripts python et perl dans un script shell contenant.
En y regardant de plus près, je pense que vous pouvez simplement utiliser la date. J'ai essayé ce qui suit sur OpenBSD : j'ai pris la date du 29 février 2008 et une heure aléatoire (sous la forme 080229301535) et j'ai ajouté 1 à la partie jour, comme ceci :
$ date -j 0802301535
Sat Mar 1 15:35:00 EST 2008
Comme vous pouvez le voir, la date a correctement formaté l'heure...
HTH
Pour faire de l'arithmétique avec des dates sous UNIX, vous obtenez la date en nombre de secondes depuis l'époque UNIX, faites quelques calculs, puis reconvertissez-vous dans votre format de date imprimable. La commande de date devrait pouvoir à la fois vous donner les secondes depuis l'époque et convertir à partir de ce nombre en une date imprimable. Ma commande de date locale le fait,
% date -n
1219371462
% date 1219371462
Thu Aug 21 22:17:42 EDT 2008
%
Consultez votre page de manuel date(1)
locale.
Pour incrémenter un jour, ajoutez 86 400 secondes.