需要有关脚本的帮助。我试图确保用户输入有效的学期,例如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
答案 0 :(得分:0)
方括号介绍了字符类,所以
[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
答案 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