2013-09-11 7 views
5

Итак, я пытаюсь написать простой скрипт в bash, который запрашивает у пользователя дату ввода в в следующем формате (YYYY-dd-mm). К сожалению, я застрял на первом шаге, который проверяет, что ввод находится в правильном формате. Я пробовал использовать «дату» без везения (так как он возвращает фактическую текущую дату). Я пытаюсь сделать это максимально простым. Спасибо за помощь!пользовательский формат даты ввода даты в bash

ответ

20

Использование регулярных выражений:

if [[ $date =~ ^[0-9]{4}-[0-3][0-9]-[0-1][0-9]$ ]]; then 

или с Баш шариков:

if [[ $date == [0-9][0-9][0-9][0-9]-[0-3][0-9]-[0-1][0-9] ]]; then 

Обратите внимание, что регулярное выражение будет принимать дату, как 9999-00-19, которая не является правильной даты. Поэтому после проверки правильности этого регулярного выражения вы должны убедиться, что цифры верны.

IFS='-' read -r year day month <<< "$date" 

Это поместит число в $year$day и $month переменных.

+0

Совершенных, он делает именно то, что он должен ! Спасибо! – lukabix22

1
date -d "$date" +%Y-%m-%d 

Последний формат, -d позволяет ввести дату ввода. Если это неверно, оно вернет ошибку, которая может быть передана в бит ведро, если она верна, она вернет дату.

Модификаторы формата можно найти на странице руководства man 1 date. Вот пример с массивом 3 даты:

dates=(2012-01-34 2014-01-01 2015-12-24) 

for Date in ${dates[@]} ; do 
    if [ -z "$(date -d $Date 2>/dev/null)" ; then 
     echo "Date $Date is invalid" 
    else 
     echo "Date $Date is valid" 
    fi 
done 

Только примечания предостережения: набрав man date в Google во время работы может производить некоторые NSFW результатов;)

+1

один для ввода 'man date' в Google – pythonian29033

Смежные вопросы