我一直在编写一个小的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
答案 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