Я мог бы вычислить текущий день + 28 дней с помощью
$ date -d '28 days'
Fri 13 Sep 2019 11:32:38 PM CST
Как можно вычислить произвольно указанный день, чтобы добавить 28 дней, сказав
date -d "2019-8-8 + 28 дней "
shuf
- генерируйте случайные перестановкиМожно использовать shuf
для этого следующим образом:
date -d "$(shuf -n1 -i0-2019)-$(shuf -n1 -i1-12)-$(shuf -n1 -i1-31) + 28 days"
Например. shuf -n1 -i0-2019
выводы 1
число из списка чисел от 0
кому: 2019
, таким образом, это дает Вам случайный год в этом диапазоне. То же сделано в течение месяца (1-12
) и день (1-31
). Этот подход имеет одну проблему: Как, например, “2019-2-31” не допустимая дата date
перестанет работать с ошибкой:
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