Почему регулярное выражение совпадает с пустой правой частью false в bash 3.2, а true в 4.2? - PullRequest
0 голосов
/ 28 мая 2019

Дано две строки: -

a="hello h" 
b="" 

В bash версии 4.2 их регулярное выражение сравнивает результаты в true

[[ "${a}" =~ "${b}" ]]
echo $?                           # 0

В bash версии 3.2 результаты регулярного выражения сравниваются в false

[[ "${a}" =~ "${b}" ]]
echo $?                           # 2

Редактировать: 1-й результат запускается на ОС Linux с доставкой с 4.2.46 (2) -релизом bash, в то время как 2-й результат запускается ОС Mojave с 3.2.57 (1) -релизом bash.

1 Ответ

5 голосов
/ 28 мая 2019

совпадение с регулярным выражением bash в разных версиях bash ведет себя по-разному

Очевидно, что это так.

В bash версии 3.2 сравнение с регулярным выражением приводит к ложному

Это не совсем правильно.Вы указываете, что статус выхода равен 2, что говорит о том, что данный шаблон синтаксически неверен.Да, это результат ошибки, и в логическом контексте статус будет рассматриваться как ложный, но это не означает, что строка не соответствует шаблону.Скорее, это говорит о том, что никакая попытка сопоставления с регулярным выражением не была выполнена вообще.

Я не уверен, где найти руководство для Bash 3.2, которое довольно старое, но не безумно, что оно отклоняет пустые регулярные выражения.Вы должны быть в состоянии обойти эту проблему, обрабатывая регистр пустых регулярных выражений специально:

[[ -z "${b}" ]] || [[ "${a}" =~ "${b}" ]]
echo $?

Обратите внимание, однако, что цитирование регулярного выражения приводит к тому, что оно рассматривается как обычная строка.Если вы хотите проверить, отображается ли простая строка, хранящаяся в переменной b, в качестве подстроки той, которая хранится в a, то вы также можете сделать это с помощью выражения case:

case $a in
  *${b}*) echo "it matches" ;;
  *)      echo "it doesn't match" ;;
esac
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...