Проверьте, соответствует ли строка регулярному выражению в сценарии Bash
Одним из аргументов, которые получает мой скрипт, является дата в следующем формате: yyyymmdd
.
Я хочу проверить, получаю ли я действительную дату в качестве ввода.
Как я могу это сделать? Я пытаюсь использовать регулярное выражение, например: [0-9]\{\8}
- Дата даты YYYY-MM-DD в сценарии оболочки
- Сценарий оболочки для захвата идентификатора процесса и его уничтожения, если существует
- $$ в скрипте vs $$ в подоболочке
- Как разбить строку на разделителе в Bash?
- Случайное число из диапазона в сценарии Bash
Ты можешь сказать:
[[ $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"
Обратите внимание, что это основано на решении Aleks-Daniel Jakimenko в проверке формата даты ввода пользователя в bash .
В shellх, таких как sh
или fish
– менее оборудованные, а затем bash
– вы можете использовать grep
:
(echo "$date" | grep -Eq ^regex$) && echo "matched" || echo "did not match"
В версии bash 3 вы можете использовать оператор ‘= ~’:
if [[ "$date" =~ "[0-9]\{8\}" ]]; then echo "Valid date" else echo "Invalid date" fi
Ссылка: http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF
ПРИМЕЧАНИЕ. Цитирование в операторе сопоставления в двойных скобках, [[]], больше не требуется в версии Bash версии 3.2
Хороший способ проверить, является ли строка правильной датой, – использовать дату команды:
if date -d "${DATE}" >/dev/null 2>&1 then # do what you need to do with your date else echo "${DATE} incorrect date" >&2 exit 1 fi
Я бы использовал expr match
вместо =~
:
expr match "$date" "^[0-9]\{8\}" >/dev/null && echo yes
Это лучше, чем принятый в настоящее время ответ на использование =~
потому что =~
также будет соответствовать пустым строкам, что ИМХО это не должно. Предположим, что badvar
не определен, затем [[ "1234" =~ "$badvar" ]]; echo $?
[[ "1234" =~ "$badvar" ]]; echo $?
дает (неправильно) 0
, а expr match "1234" "$badvar" >/dev/null ; echo $?
expr match "1234" "$badvar" >/dev/null ; echo $?
дает правильный результат 1
.
Мы должны использовать >/dev/null
чтобы скрыть выходное значение expr match
, то есть количество совпадающих символов или 0, если совпадение не найдено. Обратите внимание, что его выходное значение отличается от его статуса выхода . Состояние выхода равно 0, если найдено совпадение, или 1 в противном случае.
Как правило, синтаксис expr
равен:
expr match "$string" '$substring'
Или:
expr "$string" : '$substring'
где $substring
является регулярным выражением.