Вы можете использовать тестовую конструкцию [[ ]]
вместе с оператором соответствия регулярного выражения, =~
чтобы проверить, соответствует ли строка шаблону регулярного выражения.
Для вашего конкретного случая вы можете написать:
[[ $date =~ ^[0-9]{8}$ ]] && echo "yes"
Или более точный тест:
[[ $date =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] && echo "yes"
# |^^^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^^^^^ ^^^^^^ |
# | | ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ |
# | | | | |
# | | \ | |
# | --year-- --month-- --day-- |
# | either 01...09 either 01..09 end of line
# start of line or 10,11,12 or 10..29
# or 30, 31
То есть вы можете определить регулярное выражение в Bash, соответствующее желаемому формату. Таким образом, вы можете сделать:
[[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match"
где команды after &&
выполняются, если проверка прошла успешно, и команды after ||
выполняются, если проверка не удалась.
Обратите внимание, что это основано на решении Алекса-Даниэля Якименко в « Проверка формата ввода даты пользователем в bash» .
В других оболочках вы можете использовать grep . Если ваша оболочка совместима с POSIX, сделайте
(echo "$date" | grep -Eq ^regex$) && echo "matched" || echo "did not match"
В рыбе , которая не соответствует POSIX, вы можете сделать
echo "$date" | grep -Eq "^regex\$"; and echo "matched"; or echo "did not match"