si con expresiones regulares en código bash

si con expresiones regulares en código bash

En bashhice lo siguiente. Esta ifexpresión evaluará truesi la versión de Redhat es 7.5 o 7.6.

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

¿Podemos hacerlo de una forma más elegante con expresiones regulares?

Este es el contenido de /etc/redhat-release:

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

Respuesta1

Es mucho más sencillo comprobar la cadena de liberación directamente

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

El grepcomando coincide por expresión regular. El [56]átomo coincide con 5o 6, permitiendo que el patrón coincida con 7.5o 7.6. Desde .partidoscualquier personajeLo escapé con una barra invertida para que coincida con un punto literal. El espacio final garantiza que no haya otros caracteres después de la cadena de versión coincidente.

Respuesta2

Puedes hacer esto con bashla coincidencia de cadenas incorporada. Tenga en cuenta que esto utiliza patrones globales (comodines), no expresiones regulares.

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

O, de eliminamos elUUoC:

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

o...

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

o incluso (gracias a @kojiro)...

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

(Tenga en cuenta que se necesitan comodines al principio y al final para que coincida con toda la línea. El espacio entrecomillado después del número es para asegurarse de que no coincida accidentalmente con "7,50".)

O si realmente desea utilizar expresiones regulares, utilice =~y cambie a la sintaxis RE:

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

(Tenga en cuenta que la parte entre comillas coincidirá literalmente, por lo que .no es necesario utilizar caracteres de escape ni entre corchetes (siempre que no habilite bash31la compatibilidad). Y las coincidencias RE no están ancladas de forma predeterminada, por lo que no es necesario cualquier cosa en los extremos como en el último.)

Respuesta3

awkPuede hacer todo el trabajo de caty [[...]]aquí:

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

O simplemente con shsintaxis estándar con coincidencia de patrones comodín simple:

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

Respuesta4

Bash puede extraer el campo 7 de una línea usando read, y estos archivos de tipo "/etc/*-release" tienden a ser una línea de todos modos. Considerar

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

información relacionada