Arithmétique des dates dans les scripts shell Unix

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 ?

请先 登录 后评论

4 réponses

ggasp
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
请先 登录 后评论
Justin Standard

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.

请先 登录 后评论
abyx

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

请先 登录 后评论
caerwyn

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.

请先 登录 后评论