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

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

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

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

Ответ 1

Было изменено между 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

Ответ 2

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

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