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

时间:2018-11-19 11:47:27

标签: regex bash if-statement digits alphabetical

需要有关脚本的帮助。我试图确保用户输入有效的学期,例如F18 F19等。

可以使用的字母是F S M N(分别是秋,春,夏,特殊),数字是年,18 19 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 :(得分:0)

方括号介绍了字符类,所以

[f|F]

匹配三个字符之一:f|F

类似地,

[10-99]

10匹配到99,这等效于[0-9][0123456789]

所以,您需要

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

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

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

答案 1 :(得分:0)

请尝试使用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