如何匹配bash case语句中的数字字符串

时间:2017-03-03 03:48:20

标签: bash case numeric

我试图在case语句中匹配5到7个数字的字符串。我没有尝试过成功的作品。 这是我尝试过的事情之一。

^[0-9]*$ ) 
  echo "Got it!" 
  ;;

如何成功完成此操作?

3 个答案:

答案 0 :(得分:5)

bash case语句中的模式是文件globs,而不是正则表达式。您最好的选择可能是if / else链而不是case

if [[ "$string" =~ ^[0-9]{5,7}$ ]]; then
  echo "Got it!"
fi

但是,如果您对确切的长度不那么挑剔,可以使用扩展的水滴特征来匹配" 1个或更多个数字":

shopt -s extglob
case "$string" in
  (+([0-9])) echo "Got it!";;
esac

答案 1 :(得分:4)

$ shopt -s extglob
$ isNum() { case $1 in (+([0-9])) echo 'Got it!' ;; esac; }
$ isNum 123A
$ isNum A123
$ isNum 1234
Got it!

如果您还要检查长度,可以单独进行:

isNum() {
  local len=${#1}
  if (( len < 5 || len > 7 )); then return; fi
  case $1 in (+([0-9])) echo 'Got it!' ;; esac
}

这里的技巧是“extglob”(扩展的glob)语法,它允许类似于正确的正则表达式的功能。在一个extglob中+(...)表示“一个或多个......”。

有关详细信息,请参阅bash-hackers页面Patterns and pattern matching

除了在ksh93中,globs的功能不足以匹配特定数量的重复 - 你需要自己写出来。例如:

# this is very clumsy, but works in all POSIX shells
isNum() {
  case $1 in [0-9][0-9][0-9][0-9][0-9])           : "Matched 5" ;;
             [0-9][0-9][0-9][0-9][0-9][0-9])      : "Matched 6" ;;
             [0-9][0-9][0-9][0-9][0-9][0-9][0-9]) : "Matched 7" ;;
             *) return ;;
  esac
  echo "Got it!" # only reached if the "return" didn't happen
}

因此,您可能最好使用Mark Reed的答案中描述的仅限bash的正则表达式语法 - 另请参阅the relevant bash-hackers page

答案 2 :(得分:0)

如果你真的,真的想使用case语句,那么这就行了:

string=12345
case "${#string}-${string}" in
  5-[0-9]*)
    echo "'${string}' contains 5 digits"
    ;;
  7-[0-9]*)
    echo "'${string}' contains 7 digits"
    ;;
  *)
    echo "Something else"
    ;;
esac

我们的想法是对字符进行计数并将计数前置到数字中,以便case字符串包含除文本本身之外的有关长度的元数据。