![Проверка даты ввода данных пользователем в скрипте оболочки](https://rvso.com/image/1449493/%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0%20%D0%B4%D0%B0%D1%82%D1%8B%20%D0%B2%D0%B2%D0%BE%D0%B4%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%BC%20%D0%B2%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B5%20%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B8.png)
Как мне выполнить проверку даты при вводе пользователем в скрипте оболочки? Я хочу уведомить пользователя, если он введет дату в неправильном формате. Правильный формат будет YYYYMMDD.
решение1
Этот метод обрабатывает ввод как строку, затем анализирует и проверяет ее на правильность форматирования. В этой форме я также проверяю, верны ли поля в дате, но вы можете удалить эти условия, если они вам не нужны.
#!/bin/bash
echo -n "Enter the date as YYYYMMDD >"
read date
if [ ${#date} -eq 8 ]; then
year=${date:0:4}
month=${date:4:2}
day=${date:6:2}
month30="04 06 09 11"
leapyear=$((year%4)) # if leapyear this is 0
if [ "$year" -ge 1901 -a "$month" -le 12 -a "$day" -le 31 ]; then
if [ "$month" -eq 02 -a "$day" -gt 29 ] || [ "$leapyear" -ne 0 -a "$month" -eq 02 -a "$day" -gt 28 ]; then
echo "Too many days for February... try again"; exit
fi
if [[ "$month30" =~ "$month" ]] && [ "$day" -eq 31 ]; then
echo "Month $month cannot have 31 days... try again"; exit
fi
else echo "Date is out of range"; exit
fi
else echo "try again...expecting format as YYYYMMDD"; exit
fi
echo "SUCCESS!"
echo "year: $year month: $month day: $day"
решение2
Вам может понравиться возможность принимать множество форматов и преобразовывать их в стандартную форму; в этом date
вам может помочь команда:
$ day=$(unset day;
until date -d "${day:-XXX}" '+%Y%m%d' 2>/dev/null
do read -p "Which day? " day
done)
Which day?
Which day? weds
Which day? friday
$ echo $day
20150508