Как использовать регулярные выражения в сценариях bash?

Я хочу проверить, есть ли у переменной действительный год, используя регулярное выражение. Читая руководство по bash, я понимаю, что мог бы использовать оператор = ~

Глядя на приведенный ниже пример, я ожидал увидеть «не ОК», но вижу «ОК». Что я делаю неправильно?

i="test"
if [ $i=~"200[78]" ]
then
  echo "OK"
else
  echo "not OK"
fi

person idrosid    schedule 20.11.2008    source источник
comment
возможный дубликат регулярного выражения bash с кавычками?   -  person outis    schedule 01.04.2012
comment
Обратите внимание, что это не удалось из-за отсутствия пробелов вокруг =~.   -  person fedorqui 'SO stop harming'    schedule 20.06.2016


Ответы (2)


Он был изменен между 3.1 и 3.2:

Это краткое описание новых функций, добавленных в bash-3.2 с момента выпуска bash-3.1.

Заключение строкового аргумента в кавычки для оператора [[command = ~ теперь приводит к принудительному сопоставлению строк, как и с другими операторами сопоставления с образцом.

Так что используйте его без кавычек так:

i="test"
if [[ $i =~ 200[78] ]] ; then
    echo "OK"
else
    echo "not OK"
fi
person paxdiablo    schedule 20.11.2008
comment
Как мне справиться с ситуацией, когда регулярное выражение содержит пробелы, если я не могу процитировать? Если регулярное выражение, например, a +b он сообщит о синтаксической ошибке ... - person Alderath; 06.08.2013
comment
@Alderath: используйте a\ \+b, чтобы экранировать пробел и знак плюса. - person blinry; 18.08.2013

Вам нужны пробелы вокруг оператора = ~

i="test"
if [[ $i =~ "200[78]" ]];
then
  echo "OK"
else
  echo "not OK"
fi
person michiel    schedule 24.02.2010
comment
Ответ paxdiablo правильный, добавление пробелов здесь не помогает (теперь вы тоже не в порядке для 2008, единственная строка, которая соответствует, буквально 200 [78]). - person Marcel Stimberg; 26.09.2012