Проверка даты ввода пользователем сценария оболочки

5415
THE DOCTOR

Как мне выполнить проверку даты при вводе пользователем в сценарии оболочки? Я хочу уведомить пользователя, если он введет дату в неправильном формате. Правильный формат будет ГГГГММДД.

1
Для этого уже есть хороший пост: http://stackoverflow.com/questions/18709962/bash-regex-if-statement rfportilla 9 лет назад 0

2 ответа на вопрос

1
Toby Speight

Вам может понравиться возможность принимать множество форматов и преобразовывать их в стандартную форму; dateкоманда может помочь:

$ day=$(unset day; until date -d "$" '+%Y%m%d' 2>/dev/null do read -p "Which day? " day done) Which day?  Which day? weds  Which day? friday $ echo $day 20150508 
У меня проблемы с тем, чтобы заставить это работать на всех. Я считал дату в переменную $ YMD, и я хочу продолжить, если дата имеет правильный формат, в противном случае я бы хотел снова предложить пользователю повторно ввести дату в правильном формате. THE DOCTOR 9 лет назад 0
Покажите нам свой код! Приведенный выше фрагмент кода делает что-то полезное, но я не могу (пока) понять, почему это не полезно для вас. Toby Speight 9 лет назад 0
1
Chris

Этот метод обрабатывает ввод как строку, затем анализирует и проверяет ее на правильное форматирование. В этой форме у меня также есть проверка правильности полей в дате, но вы можете удалить эти условия, если они вам не нужны.

#!/bin/bash echo -n "Enter the date as YYYYMMDD >" read date if [ ${#date} -eq 8 ]; then year=$ month=$ day=$ 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" 

Похожие вопросы