проверьте, указан ли аргумент даты в формате гггг-мм-дд и правильный диапазон дат

#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’