【问题标题】:Bash if statement to check for like 1 letter and 2 numbersBash if 语句检查 1 个字母和 2 个数字
【发布时间】:2018-11-19 11:47:27
【问题描述】:

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

可以使用的字母有FSMN(分别是Fall、Spring、Summer、Special)数字是年份、1819、@ 987654329@、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

【问题讨论】:

    标签: regex bash if-statement digits alphabetical


    【解决方案1】:

    方括号引入字符类,所以

    [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
    

    【讨论】:

    • 但是,如果我想限制他们不早于 10 岁且不晚于 30 岁进入,那是一种享受?另外,如果我想在任何情况下添加秋天、春天、夏天等词。所以如果有人想进入summer19,因为他们不记得M代表夏天,那看起来怎么样?
    • 也许查看extglob:@(fall|spring|summer|special) 或使用正则表达式。此外,无需一步检查所有内容,一步提取数字,另一步检查其值。
    • 看看下面我的回答。它解决了除 (10
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多