2010-04-16 6 views
11

Je dois créer un script shell bash commençant par un jour puis une boucle à travers chaque jour suivant la mise en forme de sortie en% Y_% m_dbash analyse syntaxique date shell, commencez par date et boucle à travers chaque jour dans le mois

Je pense que je peux soumettre un jour de début et un autre param pour le nombre de jours.

Mon problème/question est de savoir comment définir une date (qui n'est pas maintenant), puis ajouter un jour.

donc mon entrée serait 2010_04_01 6

ma sortie serait

2010_04_01 
2010_04_02 
2010_04_03 
2010_04_04 
2010_04_05 
2010_04_06 

Répondre

19
[[email protected] ~]$ cat a.sh 
#!/bin/bash 

START=`echo $1 | tr -d _`; 

for ((c=0; c<$2; c++)) 
do 
    echo -n "`date --date="$START +$c day" +%Y_%m_%d` "; 
done 

Maintenant, si vous appelez ce script avec votre params il retournera ce que vous vouliez:

[[email protected] ~]$ ./a.sh 2010_04_01 6 
2010_04_01 2010_04_02 2010_04_03 2010_04_04 2010_04_05 2010_04_06 
2
#!/bin/bash 
inputdate="${1//_/-}" # change underscores into dashes 
for ((i=0; i<$2; i++)) 
do 
    date -d "$inputdate + $i day" "+%Y_%m_%d" 
done 
0

Vous pouvez passer une date via l'option de ligne de commande -d à jour GNU gestion de plusieurs formats d'entrée:

http://www.gnu.org/software/coreutils/manual/coreutils.html#Date-input-formats

Passe date de début comme argument de ligne de commande ou utiliser la date actuelle:

underscore_date=${1:-$(date +%y_%m_%d)} 
date=${underscore_date//_/-} 

for days in $(seq 0 6);do 
    date -d "$date + $days days" +%Y_%m_%d; 
done 
-1

vous pouvez utiliser gawk

#!/bin/bash 

DATE=$1 
num=$2 
awk -vd="$DATE" -vn="$num" 'BEGIN{ 
    m=split(d,D,"_") 
    t=mktime(D[1]" "D[2]" "D[3]" 00 00 00") 
    print d 
    for(i=1;i<=n;i++){ 
     t+=86400 
     print strftime("%Y_%m_%d",t) 
    } 
}' 

sortie

$ ./shell.sh 2010_04_01 6 
2010_04_01 
2010_04_02 
2010_04_03 
2010_04_04 
2010_04_05 
2010_04_06 
2010_04_07 
1

Un script bash très basique devrait être capable de faire cela.

Script:
#/bin/bash

start_date = 20100501
num_days = 5
pour i dans seq 1 $num_days
font jour
    = date +%Y/%m/%d -d "${start_date}-${i} days"
    echo $ date # Utilisez ceci comme vous voulez!
fait

Sortie:
2010/04/30
2010/04/29
2010/04/28
2010/04/27
2010/04/26

+0

Dans le script ci-dessus, démarrer la séquence de '0' dans votre cas, au lieu de '1'. – anonymous

+0

Notez également que les tildes "' "ont disparu (à partir des parties ombrées) en raison de la formation html. – anonymous

10

Script bash très basique devrait être capable de faire ceci:

#!/bin/bash 
start_date=20100501 
num_days=5 
for i in `seq 1 $num_days` 
do 
    date=date +%Y/%m/%d -d "${start_date}-${i} days" 
    echo $date # Use this however you want! 
done 

Sortie:
2010/04/30
2010/04/29
2010/04/28
2010/04/27
2010/04/26

+0

Génial! Solution vraiment intelligente – ToinoBiclas

+1

Cela ne fonctionnerait que pour 1..30. Si vous devez répéter pendant plus d'un mois, cette solution ne fonctionnera pas. – Marcel

6

Note: aucune des solutions ici travaillera avec OS X. vous auriez besoin, par exemple, quelque chose comme ceci:

Date -v-1d +% Y% m% d

ce imprimerait hier pour vous. Ou avec des underscores bien sûr:

Date -v-1d +% Y_% m_% d

Donc, en prenant cela en compte, vous devriez être en mesure de régler certaines des boucles dans ces exemples avec cette commande à la place. L'option -v vous permettra facilement d'ajouter ou de soustraire des jours, minutes, secondes, années, mois, etc. -v + 24d ajouterait 24 jours. etc.

1

Vous pouvez également utiliser cal, par exemple

YYYY=2014; MM=02; for d in $(cal $MM $YYYY | grep "^ *[0-9]"); do DD=$(printf "%02d" $d); echo $YYYY$MM$DD; done 

(initialement publié here on my commandlinefu account)

Questions connexes