1

我一直在编写一个小 bash 脚本来帮助经验不足的 Linux 用户使用一些命令。一件事似乎在逃避我,那就是在为 if 语句进行模式匹配时使用花括号。

regex="[A-Za-z0-9]/{5/}"
if [[ $2 =~ $regex ]]
then
  num=$2
else
  echo "Invalid entry"
  exit 1
fi

这应该捕获恰好是 5 个字符的任何 AZ、az 或 0-9,不是吗?

我已经尝试了很多次,很多变化,很多引号,有和没有转义......似乎没有任何工作:

+ regex='[A-Fa-f0-9]/{5/}'
+ [[ abcd1 =~ [A-Za-z0-9]/{5/} ]]
+ echo 'Invalid entry'

有什么我想念的想法吗?

GNU bash, version 3.2.39(1)-release
4

3 回答 3

2

也许问题出在这里:

regex="[A-Za-z0-9]/{5/}"

应该:

regex="[A-Za-z0-9]\{5\}"

(注意反斜杠)

于 2013-01-29T14:19:46.997 回答
1

你应该试试

regex="[A-Za-z0-9]{5}"

编辑:您可以尝试的另一个更改是

if [[ "$2" =~ $regex ]]

Edit2:如果您只想确定是否$2为 5 个字符长,您可以尝试类似

if [ ${#2} = 5]
于 2011-08-11T15:40:37.567 回答
1

嗯,在 bash 版本“GNU bash,版本 4.1.10(4)-release”中为我工作

$ regexp="[[:alnum:]]{5}"
$ set -- "" abcde
$ [[ "$2" =~ $regexp ]] && echo y || echo n
y
$ set -- "" foo
$ [[ "$2" =~ $regexp ]] && echo y || echo n
n

请注意,不得引用右侧:

$ set -- "" abcde
$ [[ "$2" =~ "$regexp" ]] && echo y || echo n
n

您实际上不需要正则表达式:

$ glob="[[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]]"
$ set -- "" abcde
$ [[ "$2" == $glob ]] && echo y || echo n
y
$ set -- "" foo
$ [[ "$2" == $glob ]] && echo y || echo n
n
于 2011-08-11T16:09:59.970 回答