En bash
hice lo siguiente. Esta if
expresión evaluará true
si 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 grep
comando coincide por expresión regular. El [56]
átomo coincide con 5
o 6
, permitiendo que el patrón coincida con 7.5
o 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 bash
la 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 bash31
la 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
awk
Puede hacer todo el trabajo de cat
y [[...]]
aquí:
if
</etc/redhat-release awk -v ret=1 '
$7 ~ /^7\.[56]$/ {ret=0}
END {exit(ret)}'
then
...
O simplemente con sh
sintaxis 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