Bash if заявление, чтобы проверить, как 1 буква и 2 цифры - PullRequest
0 голосов
/ 19 ноября 2018

Нужна помощь со скриптом.Я пытаюсь убедиться, что пользователь вводит действительный школьный термин, например, F18, F19 и т. Д.

Могут использоваться буквы FSMN (осень, весна, лето, специальные), цифры - годы, 1819 20 21 и т. Д.

Проблема с моими текущими настройками, если кто-то пропустил ввод, например, ff18, его правильный или f181, правильный, я хочу, чтобы он принимал только 1 букву и 2 цифры.

Спасибо заранее.

#!/bin/bash

term_arg=$1
letter_range="[f|F|s|S|m|M|n|N]"
number_range="[10-99]"
if [[ "${term_arg}" = "" ]] || ! [[ "${term_arg}" =~ ${letter_range}${number_range} ]]; then
  echo "Please specify a valid term: e.g. F18, S19, M19, etc. "
  exit 1
else
  echo "The term id ${term_arg} is correct"
  exit 0
fi

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Пожалуйста, попробуйте использовать Google, так как есть много примеров того, как сделать точное совпадение. Регулярное выражение соответствует символам , а не числам . Обратите особое внимание на то, как проверяется числовая часть. Я добавил группы захвата, чтобы получить квартал и год, чтобы назначить эти части переменным, и я делаю ввод прописными буквами, чтобы вам не приходилось беспокоиться о совпадении регистра. Здесь также показано, как добавить отдельные слова, которые вы хотите проверить. И вы можете разделить квартал и год пробелом или тире, либо ни тем, ни другим, и он отлично справится с вводом этих случаев.

Попробуйте:

#!/bin/bash

term_arg=$@
quarterRegex='FALL|SPRING|SUMMER|SPECIAL'
quarterAbbrevRegex='[FSMN]'
yearRegex='[1-9][0-9]'
separatorRegex='(-|[[:space:]])?'
termRegex="^(${quarterAbbrevRegex}|${quarterRegex})${separatorRegex}(${yearRegex})$"
declare termEntry
declare yearEntry
if [[ "${term_arg^^}" =~ $termRegex ]]; then
  termEntry="${BASH_REMATCH[1]}"
  yearEntry="${BASH_REMATCH[3]}"
  echo "The term id ${term_arg} is correct:"
  echo "  Term: ${termEntry}"
  echo "  Year: ${yearEntry}"
  exit 0
else
  echo "${term_arg} is in an incorrect format.  Please specify a valid term: e.g., F18, S19, M19, etc."
  exit 1
fi
0 голосов
/ 19 ноября 2018

В квадратных скобках вводятся классы символов, поэтому

[f|F]

соответствует любому из трех символов: f, | или F.

Аналогично,

[10-99]

соответствует 1, 0 - 9 и 9, что эквивалентно [0-9] или [0123456789].

Итак, вам нужно

[fFsSmMnN][0-9][0-9]

Обратите внимание, что это работает с обычным =, также нет необходимости использовать регулярные выражения, так как правая часть интерпретируется как шаблон, если не указано:

$ [[ m18 = [fsmn][0-9][0-9] ]] && echo matches
matches
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...