目前,我有一个while循环,它接受一个开始日期,运行一个python脚本,当天作为输入,然后花费一天+ 1直到达到某个截止日期。
day_start=2016-01-01
while [ "$day_start"!=2018-01-01 ] ;
do
day_end=$(date +"%Y-%m-%d" -d "$day_start + 1 day")
python script.py --start="$day_start" --end="$day_end";
day_start=$(date +"%Y-%m-%d" -d "$day_start + 1 day")
done
我想做同样的事情,但现在要在2016-01-01和2018-01-01之间选择一个随机日,并重复直到所有日子都被使用过一次。我认为它应该是for循环而不是while循环,但是我很难在bash中指定这个日期范围内的for循环。有没有人知道如何制定这个?
答案 0 :(得分:3)
由于Birthday Problem,您随机选择日期可能需要很长时间。 (你会一遍又一遍地击中大部分日期,但最后一个日期可能需要一段时间)。
我能给你的最好的主意是:
sort -R
("随机播放"内容并打印结果)sort -R
的输出,您将随机选择日期,直到达到所有日期。这是一个包含我的建议的示例脚本:
#!/bin/bash
day_start=2016-01-01
TMPFILE="$(mktemp)"
while [ "$day_start" != "2018-01-01" ] ;
do
day_start=$(date +"%Y-%m-%d" -d "$day_start + 1 day")
echo "${day_start}"
done > "${TMPFILE}"
sort -R "${TMPFILE}" | while read -r day_start
do
day_end=$(date +"%Y-%m-%d" -d "$day_start + 1 day")
python script.py --start="$day_start" --end="$day_end";
done
rm "${TMPFILE}"
顺便说一下,如果没有while [ "$day_start" != "2018-01-01" ];
中的空格,bash就不会停止你的剧本。
答案 1 :(得分:1)
幸运的是,从16岁到18岁没有闰年(或者是它,它因此而起作用)?
i%100,只是为了减少输出。
for i in {0..730}; do nd=$(date -d "2016/01/01"+${i}days +%D); if (( i % 100 == 0 || i == 730 )); then echo $nd ; fi; done
01/01/16
04/10/16
07/19/16
10/27/16
02/04/17
05/15/17
08/23/17
12/01/17
12/31/17
使用格式说明(此处为+%D),您可以将输出转换为您的需求,date --help
会有所帮助。
以更易读的格式,并使用+%F:
for i in {0..730}
do
nd=$(date -d "2016/01/01"+${i}days +%F)
echo $nd
done
2016-01-01
2016-04-10
2016-07-19
...
对于随机分布,请使用shuf(此处为简洁,7天):
for i in {0..6}; do nd=$(date -d "2016/01/01"+${i}days +%D); echo $nd ;done | shuf
01/04/16
01/07/16
01/05/16
01/01/16
01/03/16
01/06/16
01/02/16