Em bash
eu fiz o seguinte. Esta if
expressão será avaliada true
se 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 grep
comando corresponde por expressão regular. O [56]
átomo corresponde 5
a ou 6
, permitindo que o padrão corresponda a 7.5
ou 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 bash
a 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 bash31
a 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
awk
pode fazer todo o trabalho cat
e [[...]]
aqui:
if
</etc/redhat-release awk -v ret=1 '
$7 ~ /^7\.[56]$/ {ret=0}
END {exit(ret)}'
then
...
Ou apenas com sh
sintaxe 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