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

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

В bashя сделал следующее. Это ifвыражение будет оценивать trueверсию Redhat 7.5 или 7.6.

if [[ ` cat /etc/redhat-release  | awk '{print $7}' ` == "7.5" ]] || [[ ` cat /etc/redhat-release  | awk '{print $7}' ` == "7.6" ]]
then
.
.
.

Можно ли сделать это более элегантно с помощью регулярных выражений?

Это содержание /etc/redhat-release:

cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.6 (Maipo)

решение1

Гораздо проще просто проверить строку выпуска напрямую

if grep -q 'release 7\.[56] ' /etc/redhat-release
then ...

Команда grepсоответствует регулярному выражению. [56]Атом соответствует 5или 6, позволяя шаблону соответствовать 7.5или 7.6. Поскольку .соответствуетлюбой персонажЯ экранировал его обратной косой чертой, чтобы он соответствовал буквальной точке. Конечный пробел гарантирует, что после совпавшей строки версии не будет других символов.

решение2

Вы можете сделать это с помощью bashвстроенного сопоставления строк. Обратите внимание, что здесь используются шаблоны glob (wildcard), а не регулярные выражения.

if [[ $(cat /etc/redhat-release  | awk '{print $7}') == 7.[56] ]]

Или, если мы устранимУУоЦ:

if [[ $(awk '{print $7}' /etc/redhat-release) == 7.[56] ]]

или...

if [[ $(cat /etc/redhat-release) == *" release 7."[56]" "* ]]

или даже (спасибо @kojiro)...

if [[ $(< /etc/redhat-release) == *" release 7."[56]" "* ]]

(Обратите внимание, что подстановочные знаки в начале и в конце необходимы для того, чтобы оно соответствовало всей строке. Кавычки после числа нужны для того, чтобы оно случайно не совпало с «7.50».)

Или, если вы действительно хотите использовать регулярные выражения, используйте =~и переключитесь на синтаксис RE:

if [[ $(< /etc/redhat-release) =~ " release 7."[56]" " ]]

(Обратите внимание, что часть в кавычках будет сопоставлена ​​буквально, поэтому ее .не нужно экранировать или заключать в скобки (если только вы не включите bash31совместимость). А совпадения RE по умолчанию не закреплены, поэтому вам не нужно ничего добавлять на концах, как в последнем примере.)

решение3

awkможет выполнить всю работу catздесь [[...]]:

if
  </etc/redhat-release awk -v ret=1 '
    $7 ~ /^7\.[56]$/ {ret=0}
    END {exit(ret)}'
then
  ...

Или просто со стандартным shсинтаксисом с простым сопоставлением шаблонов с подстановочными знаками:

case $(cat /etc/redhat-release) in
  (*'release 7.'[56]' '*) ...;;
  (*) ...;;
esac

решение4

Bash может вытащить поле 7 из строки с помощью read, и эти файлы типа "/etc/*-release" в любом случае имеют тенденцию быть одной строкой. Рассмотрим

read _ _ _ _ _ _ ver _ < /etc/redhat-release
if [[ $ver = 7.[56] ]]; then
    # match
fi

Связанный контент