Bash if 语句检查 1 个字母和 2 个数字
Bash if statement to check for like 1 letter and 2 numbers
需要脚本方面的帮助。我试图确保用户输入有效的学期,例如 F18
、F19
等
可以使用的字母有F
、S
、M
、N
(分别是Fall、Spring、Summer、Special)数字是年份,18
、19
、20
、21
等
我当前设置的问题如果有人输入错误,例如 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]
匹配 1
、0
到 9
和 9
,相当于 [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
需要脚本方面的帮助。我试图确保用户输入有效的学期,例如 F18
、F19
等
可以使用的字母有F
、S
、M
、N
(分别是Fall、Spring、Summer、Special)数字是年份,18
、19
、20
、21
等
我当前设置的问题如果有人输入错误,例如 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]
匹配 1
、0
到 9
和 9
,相当于 [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