Проверка формата даты в bash

Используйтеfind -exec

cd /path/to/source
find. -size -50k -type f -exec cp --parents {} /destination/ \;
2
13.09.2021, 15:39
2 ответа

Распространенным способом проверки ввода является использование бесконечного цикла, из которого вы выходите, как только ввод подтвержден.

В данном случае «проверено» означает, что входная строка содержит только восемь цифр и что GNU dateможет использовать эту дату в качестве аргумента опции для своей опции -d.

С помощью bashмы могли бы записать это как

while true; do
    read -r -p 'Input date: '

    if [[ $REPLY =~ ^[[:digit:]]{8}$ ]] && date -d "$REPLY" >/dev/null 2>&1
    then
        break
    fi

    echo 'Invalid format, try again' >&2
done

thedate=$REPLY

Это считывает дату в начале нашего цикла, а затем проверяет ее с помощью регулярного выражения, которое будет соответствовать, если строка содержит только восемь цифр. Если этот тест проходит успешно, строка также проверяется с помощью GNU date. Если все идет хорошо, выход из цикла выполняется с помощью оператора break.

В shнам нужно заменить сопоставление регулярного выражения на соответствие шаблону оболочки:

while true; do
    printf 'Input date: ' >&2
    read -r REPLY

    case $REPLY in
        *[![:digit:]]*)
            ;;
        ????????)
            date -d "$REPLY" >/dev/null 2>&1 && break
    esac

    echo 'Invalid format, try again' >&2
done

thedate=$REPLY

Тест здесь сначала проверяет, содержит ли строка какой-либо другой символ, кроме цифры.Если этот тест не пройден, следующий тест проводится ровно для восьми символов. Если этот тест проходит успешно, у нас есть строка из восьми цифр, и мы проверяем ее с помощью GNU dateи выходим из цикла, если дата в порядке.

3
13.09.2021, 19:20

Или без бесконечного цикла и с использованием команды BSD date(1):

REPLY=
valid=false

while ! $valid; do

    read -r -p 'Input date: '

    if ([[ $REPLY =~ ^[[:digit:]]{8}$ ]]) && (date -j +%Y%m%d ${REPLY}0000 >/dev/null 2>&1)
    then
        valid=true
    else
        echo 'Invalid format, try again' >&2
    fi

done

thedate=$REPLY

Синтаксис ${REPLY}0000необходим, поскольку BSD dateтребует полного YmdHM, но достаточно установить HM по умолчанию на 0000.

1
13.09.2021, 20:31

Теги

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