Bash if 语句检查 1 个字母和 2 个数字

Bash if statement to check for like 1 letter and 2 numbers

需要脚本方面的帮助。我试图确保用户输入有效的学期,例如 F18F19

可以使用的字母有FSMN(分别是Fall、Spring、Summer、Special)数字是年份,18192021

我当前设置的问题如果有人输入错误,例如 ff18,它是正确的,或者 f181 它是正确的。我希望它只接受 1 个字母和 2 个数字。

#!/bin/bash

term_arg=
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

方括号引入字符类,所以

[f|F]

匹配以下三个字符中的任何一个:f|F.

同样,

[10-99]

匹配 1099,相当于 [0-9][0123456789].

所以,你需要

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

请注意,这也适用于普通 =,无需使用正则表达式,因为除非引用,否则右侧将被解释为模式:

$ [[ m18 = [fsmn][0-9][0-9] ]] && echo matches
matches

请尝试使用Google,因为有很多关于如何进行精确匹配的示例。正则表达式匹配 个字符 ,而不是 个数字 。请特别注意数字部分的检查方式。我添加了捕获组以获取季度和年份以将这些部分分配给变量,并且我将输入大写,这样您就不必担心匹配大小写。这也显示了如何添加要检查的单个单词。您可以用 space 或破折号分隔季度和年份,或者两者都不分隔,它可以很好地处理这些情况的输入。

尝试:

#!/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