Як використовувати регулярні вирази в скриптах bash?


83

Я хочу перевірити, чи є у змінної дійсний рік, використовуючи регулярний вираз. Читаючи посібник із Bash, я розумію, що міг би використовувати оператор = ~

Дивлячись на приклад нижче, я міг би побачити "не добре", але я бачу "добре". Що я роблю не так?

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


Зауважте, це не вдалося через відсутність місця навколо =~.
Fedorqui 'SO prestani шкодити'

Відповіді:


116

Його змінили між 3.1 і 3.2:

Це стислий опис нових функцій, доданих до bash-3.2 з моменту випуску bash-3.1.

Цитування аргументу рядка оператору [[command's = ~] тепер змушує збіг рядків, як і з іншими операторами збігу шаблонів.

Тож використовуйте його без лапок таким чином:

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

1
Як я можу вирішити ситуацію, коли регулярний вираз містить пробіли, якщо я не можу цитувати? Якщо регулярний вираз є, наприклад, a +bвін повідомить про синтаксичну помилку ...
Альдерат,

5
@Alderath: Використовуйте, a\ \+bщоб уникнути простору та символу плюса.
blinry

8

Вам потрібні пробіли навколо оператора = ~

i = "тест"
якщо [[$ i = ~ "200 [78]"]];
тоді
  ехо "ОК"
ще
  ехо "не в порядку"
fi

3
Відповідь paxdiablo правильна, додавання пробілів тут не допомагає (тепер ви також отримуєте "не в порядку" для 2008 року, єдиний рядок, який відповідає буквально "200 [78]").
Marcel Stimberg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.