shuf- 生成随机排列

shuf- 生成随机排列

我可以用以下方法计算当前日期 + 28 天

$ date -d '28 days'
Fri 13 Sep 2019 11:32:38 PM CST

如何计算一个随机指定的日期加 28 天,说

日期 -d "2019-8-8 + 28 天"

答案1

shuf- 生成随机排列

您可以shuf按如下方式使用:

date -d "$(shuf -n1 -i0-2019)-$(shuf -n1 -i1-12)-$(shuf -n1 -i1-31) + 28 days"

例如,从到的数字列表中shuf -n1 -i0-2019输出数字,因此它会为您提供此范围内的随机年份。对月()和日()也执行相同的操作。这种方法有一个问题:例如“2019-2-31”不是有效日期,将失败并出现错误:1020191-121-31date

date: invalid date ‘2019-2-31’

解决方法循环

您可以使用仅在命令成功执行时退出的循环来解决这个问题,并抑制错误消息(通过将 stderr 重定向到/dev/null):

while :; do
  if date -d "$(shuf -n1 -i0-2019)-$(shuf -n1 -i1-12)-$(shuf -n1 -i1-31) + 28 days"; then
    break
  fi
done 2>/dev/null

示例运行

$ while :;do if date -d "$(shuf -n1 -i0-2019)-$(shuf -n1 -i1-12)-$(shuf -n1 -i1-31)+28days";then break;fi;done 2>/dev/null
Tue Nov 19 00:00:00 CET 1946

多个日期的循环

如果您想要创建多个这样的随机日期,请按如下方式更改循环:

i=0
while ((i<3)); do
  if date -d "$(shuf -n1 -i0-2019)-$(shuf -n1 -i1-12)-$(shuf -n1 -i31-31) + 28 days"; then
    ((i++))
  fi
done 2>/dev/null

第 2 行中的数字(这里我使用了3)是输出的日期数。

示例运行

$ i=0;while ((i<3));do if date -d "$(shuf -n1 -i0-2019)-$(shuf -n1 -i1-12)-$(shuf -n1 -i31-31)+28days";then ((i++));fi;done 2>/dev/null
Sat Nov 28 00:00:00 LMT 0572
Wed Apr 28 00:00:00 LMT 0771
Sun Nov 28 00:00:00 LMT 0917

相关内容