Bash shell if语句匹配正则表达式与花括号{}

时间:2011-08-11 15:26:28

标签: regex bash if-statement curly-braces

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

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

这应该捕获任何A-Z,a-z或0-9正好是5个字符,如果不是的话?

我已经尝试了很多次,很多变化,很多引用,有和没有逃避......似乎没有什么工作:

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

我缺少什么想法?

GNU bash, version 3.2.39(1)-release

3 个答案:

答案 0 :(得分:2)

问题就在这里:

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

应该是:

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

(观看反斜杠)

答案 1 :(得分:1)

你应该试试

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

编辑:您可以尝试的其他更改

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

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

的内容
if [ ${#2} = 5]

答案 2 :(得分:1)

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

$ 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