繁体   English   中英

在bash脚本中随机循环几天

[英]Randomly loop over days in bash-script

目前,我有一个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年1月1日至2018年1月1日之间的任意一天,重复直到所有天都用一次。 我认为应该是for循环,而不是while循环,但是我在bash中无法在此日期范围内指定for循环。 有谁知道如何制定这个想法?

如果由于生日问题而随机选择日期,可能会花费很长时间。 (您会一遍又一遍地敲击大多数日期,但最后一个日期可能会花费一些时间)。

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

  • 在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" ];没有空格while [ "$day_start" != "2018-01-01" ]; ,bash不会停止您的脚本。

幸运的是,从16到18都没有leap年(或者是leap年,正因为如此)?

  • 幻数: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 --helpdate --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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM