2013-05-13 4 views
1

У меня есть сценарий оболочки Bash, который проверяет, является ли переменная оболочка содержит ряд:Bash shell: Как проверить определенный формат даты?

if ! [[ "$step" =~ ^[0-9]+$ ]] 
    then 
    exec >&2; echo "error: $step is Not a step number."; 
    exit 1 
    fi 

Теперь мне нужно сделать подобную проверку, чтобы увидеть, если переменная содержит дату в требуемом формате, который YYYY-MM-DD(пример: сегодня - 2013-05-13) с тире. Как это можно сделать с помощью регулярного выражения в оболочке Bash или мне нужна внешняя программа для этого?

ответ

12

regex - неправильный инструмент для выполнения этой работы.

например.

2013-02-29 (invalid date) 
2012-02-29 (valid date) 
2013-10-31 (valid date) 
2013-09-31 (invalid date) 
... 

Я хотел бы предложить передавая строку date -d, а затем проверить возвращаемое значение. если возврат 0, все в порядке. если return 1, неверная дата.

, например:

kent$ date -d "2012-02-29" > /dev/null 2>&1 
kent$ echo $? 
0 

kent$ date -d "2013-02-29" > /dev/null 2>&1 
kent$ echo $? 
1 

, если вы хотите, чтобы формат yyyy-mm-dd вы можете сделать как регулярное выражение и date проверки. regex только для формата и даты для проверки даты.

т.к. date -d принимает строка как 02/27/2012 тоже.

+2

+1 отличный совет –

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