Bash shell, если оператор соответствует регулярному выражению с фигурными скобками {} - PullRequest
1 голос
/ 11 августа 2011

Я написал небольшой скрипт bash, чтобы помочь менее опытным пользователям Linux с некоторыми командами.Одна вещь, кажется, ускользает от меня, и это использование фигурных скобок при выполнении сопоставления с шаблоном для оператора if.

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

Это должно захватывать что-либо AZ, az или 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 ]

2 голосов
/ 29 января 2013

Может быть, проблема здесь:

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

Должно быть:

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

(смотреть обратную косую черту)

1 голос
/ 11 августа 2011

Хм, у меня работает в 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
1 голос
/ 11 августа 2011

Вы должны попробовать

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

Редактировать: Еще одно изменение, которое вы можете попробовать это

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

Редактировать2: Если вы просто хотитечтобы определить, если $2 имеет длину 5 символов, вы можете попробовать что-то вроде

if [ ${#2} = 5]
...