В 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