Jestem nowy w firmie linux. Jak wydrukować i zapisać datę w danym zakresie dat.Drukuj daty w zakresie dat linux
Na przykład mam startdate = 2013-03-01 i data_konczenia = 2013-03-25; Chcę wydrukować wszystkie daty w tym zakresie.
góry dzięki
Jestem nowy w firmie linux. Jak wydrukować i zapisać datę w danym zakresie dat.Drukuj daty w zakresie dat linux
Na przykład mam startdate = 2013-03-01 i data_konczenia = 2013-03-25; Chcę wydrukować wszystkie daty w tym zakresie.
góry dzięki
Korzystanie date
do konwersji dat do sekundy, zrobić trochę matematyki i przekształcić z powrotem:
#/bin/bash
dstart=2013-03-01
dend=2013-03-25
# convert in seconds sinch the epoch:
start=$(date -d$dstart +%s)
end=$(date -d$dend +%s)
cur=$start
while [ $cur -le $end ]; do
# convert seconds to date:
date [email protected]$cur +%Y-%m-%d
let cur+=24*60*60
done
Zobacz man date
uzyskać więcej informacji na temat parametrów daty ..
jako o ile daty są w formacie RRRR-MM-DD, można je porównać leksykograficznie i pozwolić, aby date
wykonał arytmetykę kalendarza bez konwersji na sekundy pierwsze:
startdate=2013-03-15
enddate=2013-04-14
curr="$startdate"
while true; do
echo "$curr"
[ "$curr" \< "$enddate" ] || break
curr=$(date +%Y-%m-%d --date "$curr +1 day")
done
W przypadku [ ... ]
należy uciec przed numerem <
, aby uniknąć pomyłki z operatorem przekierowania wejścia.
To ma brodawkę drukowania daty rozpoczęcia, jeśli jest większa niż data zakończenia.
Alternatywny jeśli chcesz „” ostatnie terminy to:
echo {100..1} | xargs -I{} -d ' ' date --date={}' days ago' +"%Y-%m-%d"
Oczywiście nie będzie działać dla dowolnych zakresów dat.
to jest blisko najlepszej odpowiedzi Myślę, że dokonałem zmiany: $ startdate = '2016-03-01'; echo {0..10} | xargs -I {} -d '' date --date = "$ startdate +" {} "dni" + "% Y-% m-% d" 2016-03-01 2016-03-02 2016- 03-03 .... – user5672998
Inną opcją jest użycie dateseq
z dateutils
(http://www.fresse.org/dateutils/#dateseq):
$ dateseq 2013-03-01 2013-03-25
2013-03-01
2013-03-02
2013-03-03
2013-03-04
2013-03-05
2013-03-06
2013-03-07
2013-03-08
2013-03-09
2013-03-10
2013-03-11
2013-03-12
2013-03-13
2013-03-14
2013-03-15
2013-03-16
2013-03-17
2013-03-18
2013-03-19
2013-03-20
2013-03-21
2013-03-22
2013-03-23
2013-03-24
2013-03-25
lekko ulepszoną wersję
#!/bin/bash
startdate=2013-03-15
enddate=2013-04-14
curr="$startdate"
while true; do
[ "$curr" \< "$enddate" ] || { echo "$curr"; break; }
echo "$curr"
curr=$(date +%Y-%m-%d --date "$curr +1 day")
done
Tak, tylko zrobić 'echo "$ Curr"' po teście;) . 'date --date" $ curr +1 day "' jest ładniejsze niż 'let cur = ..' –
Prawdopodobnie lepiej jest umieścić to w pętli for niż pętli while, aby być bezpiecznym. Jeśli sparametryzujesz datę początkową i końcową w skrypcie, pętla będzie miała maksymalną wartość 366 razy lub 1000 razy. To będzie utrzymywać go z nieskończenie pętli. – ekangas