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

83

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

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

i="test"
if [ $i=~"200[78]" ]
then
  echo "OK"
else
  echo "not OK"
fi
идрозид
источник
Обратите внимание, что это не удалось из-за недостатка свободного места =~.
fedorqui 'SO stop harming'

Ответы:

116

Он был изменен между 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
Paxdiablo
источник
1
Как мне справиться с ситуацией, когда регулярное выражение содержит пробелы, если я не могу цитировать? Если это регулярное выражение, например, a +bоно сообщит о синтаксической ошибке ...
Альдерат, 06
5
@Alderath: используйте, a\ \+bчтобы избежать пробела и символа плюса.
blinry
8

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

я = "тест"
если [[$ i = ~ "200 [78]"]];
тогда
  эхо "ОК"
еще
  эхо "не в порядке"
фи
Мишель
источник
3
Ответ paxdiablo правильный, добавление пробелов здесь не помогает (теперь вы также получаете "not OK" для 2008, единственная строка, которая соответствует буквально "200 [78]").
Марсель Стимберг,