2013-06-24 3 views
2
  1. if [[ 23ab = *ab ]] ; then echo yes; fiПонимание разницы между = и = ~ операторы в Баш [[]]

    Является ли код выше регулярное выражение?

    Пожалуйста, смотрите следующее:

  2. if [[ 23ab =~ [0-9]{1,2}ab ]] ; then echo yes; fi

Итак, какая линия является регулярным выражением? Если первая строка не является регулярным выражением, почему она работает, когда мы используем *? Если есть, но когда мы вместо =~ просто используете =, как if [[ 23ab = [0-9]{1,2}ab ]], он не работает прямо сейчас.

Можете ли вы объяснить разницу между двумя линиями?

+0

Я предполагаю, что вы спрашиваете о «bash» здесь; есть несколько разных оболочек, которые работают на Linux, и лучше понять, о чем вы спрашиваете. (POSIX sh не поддерживает '[[]]', поэтому это явно не чистая оболочка POSIX, такая как зола или тире ... но теоретически вы могли бы спрашивать о ksh или zsh или других) , –

+0

Для простоты вы можете использовать этот синтаксис: '[[23ab = * ab]] && echo« yes »' –

ответ

4

[[ $a =~ $b ]] является регулярным выражением. В этом синтаксисе * соответствует 0-n экземплярам непосредственно предшествующего символа или шаблона.

[[ $a = $b ]] является образцом шаблона в стиле глобуса. В этом синтаксисе * соответствует 0-n символам любого типа.

Обратите внимание, что важно, чтобы регулярные выражения в bash хранились в переменных. То есть:

re='[0-9]{1,2}ab' 
[[ $foo =~ $re ]] 

на самом деле может отличаться от

[[ $foo =~ [0-9]{1,2}ab ]] 

... в зависимости от версии Баш вы работаете. Всегда использование переменной предотвратит возникновение проблем.

Обратите внимание, что они оба отличаются от

re='[0-9]{1,2}ab' 
[[ $foo =~ "$re" ]] ## <- LITERAL SUBSTRING MATCH _NOT_ REGULAR EXPRESSION MATCH 

... в этом случае кавычки делает содержимое $re буквальным, то есть. не рассматривается как регулярное выражение в современном bash.

+1

Hi Charles, Спасибо большое! еще один вопрос: нужно ли задавать регулярное выражение с правой стороны, я имею в виду: [[$ foo = ~ [0-9] {1,2} ab]] правильно! , но [[[0-9] {1,2} ab = ~ $ foo]] неправильно, не так ли? – Jack

+0

@Jack Правильно; шаблон или регулярное выражение могут находиться только с правой стороны. –