#shell #unix #ksh
#оболочка #unix #ksh
Вопрос:
Есть ли способ проверить, находится ли аргумент даты в правильном диапазоне дат, например
2016-10-32 или 2016-09-31 должны отображаться как недопустимые
.
я могу найти правильный аргумент гггг-мм-дд, используя приведенный ниже код
if [[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]
then echo "Date $1 is in valid format (YYYY-MM-DD)"
else echo "Date $1 is in an invalid format (not YYYY-MM-DD)"
fi
Как проверить, находится ли дата в правильном диапазоне дат
Комментарии:
1. Есть ли у вас GNU
date
? (Если нет, у какого поставщика?)2. Да, у меня есть доступная дата GNU
Ответ №1:
делегируйте проверку достоверности, чтобы date
изменить сообщения по своему усмотрению
$ d='2016-10-32'; if date -d "$d" amp;>/dev/null; then echo "$d is OK"; else echo "$d is incorrect"; fi
2016-10-32 is incorrect
$ d='2016-10-31'; if date -d "$d" amp;>/dev/null; then echo "$d is OK"; else echo "$d is incorrect"; fi
2016-10-31 is OK
Ответ №2:
Повторяя совет karakfa использовать GNU date для проверки. Показано, как проверить, находится ли дата в диапазоне, используя простое лексическое сравнение
#!/bin/bash
date=$1
start="2016-05-01"
end="2016-09-01"
ymd=$(date -d "$date" %F) || exit 1
# unfortunately, bash does not have a "<=" operator for strings
if [[ ($start < $ymd || $start = $ymd) amp;amp; ($ymd < $end || $ymd = $end) ]]; then
echo "$date in range"
else
echo "$date not in range"
fi
Как мы видим, date
он очень либерально относится к тому, что он принимает
$ bash datecheck.sh "sept 1"
sept 1 in range
$ bash datecheck.sh "sept 2"
sept 2 not in range
$ bash datecheck.sh "sept 31"
date: invalid date ‘sept 31’