在bash脚本中随机循环几天

时间:2018-02-17 22:13:26

标签: bash

目前,我有一个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循环。有没有人知道如何制定这个?

2 个答案:

答案 0 :(得分:3)

由于Birthday Problem,您随机选择日期可能需要很长时间。 (你会一遍又一遍地击中大部分日期,但最后一个日期可能需要一段时间)。

我能给你的最好的主意是:

  • 在while循环中创建所有日期(仅限day_start-line)
  • 将所有日期输出到临时文件
  • 在此文件上使用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岁没有闰年(或者是它,它因此而起作用)?

  • 幻数:2 * 365 = 730

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