se com regex no código bash

se com regex no código bash

Em basheu fiz o seguinte. Esta ifexpressão será avaliada truese a versão do Redhat for 7.5 ou 7.6.

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

Podemos fazer isso de uma forma mais elegante com expressões regulares?

Este é o conteúdo de /etc/redhat-release:

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

Responder1

Muito mais simples apenas verificar a string de lançamento diretamente

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

O grepcomando corresponde por expressão regular. O [56]átomo corresponde 5a ou 6, permitindo que o padrão corresponda a 7.5ou 7.6. Desde .as partidasqualquer personagemEu escapei com uma barra invertida para que corresponda a um ponto literal. O espaço à direita garante que não haja outros caracteres após a string da versão correspondente.

Responder2

Você pode fazer isso com basha correspondência de strings integrada. Observe que isso usa padrões glob (curinga), não expressões regulares.

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

Ou, de eliminarmos oUUoC:

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

ou...

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

ou até mesmo (graças ao @kojiro)...

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

(Observe que os curingas no início e no final são necessários para que corresponda a toda a linha. O espaço entre aspas após o número é para garantir que não corresponda acidentalmente a "7,50".)

Ou se você realmente quiser usar expressões regulares, use =~e mude para a sintaxe RE:

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

(Observe que a parte entre aspas será correspondida literalmente, portanto .não precisa ser escapada ou entre colchetes (contanto que você não habilite bash31a compatibilidade). E as correspondências RE não são ancoradas por padrão, então você não precisa qualquer coisa nas extremidades como no último.)

Responder3

awkpode fazer todo o trabalho cate [[...]]aqui:

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

Ou apenas com shsintaxe padrão com correspondência simples de padrão curinga:

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

Responder4

O Bash pode extrair o campo 7 de uma linha usando read, e esses arquivos do tipo "/etc/*-release" tendem a ter uma linha de qualquer maneira. Considerar

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

informação relacionada