Forum Programmation.shell Afficher les dates des 100 derniers jours

Posté par  .
Étiquettes : aucune
0
7
mai
2008
Bonjour (ou plustot "bonne nuit", il est 2h10),

J'ai envie d'afficher les dates des 100 derniers jours dans un format bien précis. Pour ce qui est du format c'est bon, j'ai trouvé (man date). Par contre je n'ai pas réussi à scripter la récursivité. Voila ce que j'ai essayé et qui me parraissait bon :
for i in $(seq 1 100); do
date +"%d%m%Y" --date '($i) days ago';
done
Ce qui me donne 100 fois la date d'hier !

Si je fais
for i in $(seq 1 100); do
echo $i;
done
j'ai bien les chiffres 1 à 100 qui s'affichent.

Il y a donc quelque-chose qui m'échappe : si ça fonctionne avec echo, pourquoi ça ne fonctionnerai pas avec date ? Et comment je fais moi maintenant pour avoir mes 100 dates sans avoir à les taper une à une à la mimine ?

--
Rénald.
  • # -d "string"

    Posté par  . Évalué à 4.


    for i in $(seq 1 100); do
    date +"%d%m%Y" --date "$i days ago";
    done
  • # C'est simple

    Posté par  . Évalué à 8.

    D'abord, je ne comprend pas pourquoi tu écris "($i)" à la place de "$i". Ça ne marche simplement pas. Ensuite, si tu utilises des guillemets simples, les variables ne sont pas interprétés. Pour qu'une variable soit interprétée, il faut utiliser des guillemets doubles. Il aurait donc fallu écrire :
    for i in $(seq 1 100)
        do  date +"%d%m%Y" --date "$i days ago"
    done
    
    Ce qui marche très bien.
    • [^] # Re: C'est simple

      Posté par  . Évalué à 1.

      Merveilleux, ça marche avec les guillemets doubles et sans les parenthèses. J'avais mis des guillemets simples parce que j'avais récupéré la commande date +'%d%m%Y" --date "3 days ago' dans un ancien script, et sans variable, les guillemets simples font très bien l'affaire.

      Merci pour votre aide en tout cas.

      --
      Rénald
  • # Récursivité

    Posté par  . Évalué à 2.

    Les commentaires concernants les guillements sont exacts: les guillemets simples sont fait pour ne pas interpréter leur contenu, donc tes variables ne sont pas remplacées par leur valeur.

    Juste un mot sur la récursivité: ce n'est qu'une boucle, pas de récursivité :-)
    • [^] # Re: Récursivité

      Posté par  . Évalué à 1.

      Exact, le terme était mal choisi. Mea culpa.

      --
      Rénald
      • [^] # Re: Récursivité

        Posté par  (site web personnel) . Évalué à 3.

        Ou alors on se la pète jusqu'au bout :

        #!/bin/sh

        aff_date()
        {
        if [ $1 -gt 0 ]; then
        aff_date `expr $1 - 1`;
        date +"%d%m%Y" --date "$1 days ago";
        fi
        }

        aff_date 100;
        • [^] # Joli !

          Posté par  . Évalué à 2.

          J'aurais inversé la ligne aff_date... et la ligne date +...

          Dans ton cas, on "empile" les appels avant d'afficher. En cas de blocage quelque part, on ne voit rien. En inversant les deux lignes, on affiche chaque fois qu'on fait un pas de plus dans la récursivité.
          • [^] # Re: Joli !

            Posté par  (site web personnel) . Évalué à 2.

            J'ai volontairement fait comme ça pour afficher de la même manière qu'avec la boucle for. Sinon ça m'aurais obligé à faire le test "tant que <= 100" à place et fait l'appel avec la valeur 1 mais c'est encore moins générique du coup j'aurais eu besoin d'une seconde valeur pour que cela le redevienne... Bref :). De toute façon, ici ça sert à rien, l'itératif, c'est mieux.
            • [^] # Re: Joli !

              Posté par  (site web personnel) . Évalué à 2.

              Quand je dis "de la même manière", on aura bien évidemment compris "dans le même ordre", c'est à dire de 1 à 100 et non de 100 à 1 ce qui aurait été la conséquence de l'inversion de ces 2 lignes comme tu le proposes.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.