¿Cómo uso una comparación grep de archivos dentro de una declaración bash if / else?


138

Cuando nuestro servidor aparece, necesitamos verificar un archivo para ver cómo está configurado el servidor.

Queremos buscar la siguiente cadena dentro de nuestro archivo /etc/aws/hosts.conf:

MYSQL_ROLE=master

Luego, queremos probar si esa cadena existe y usar una instrucción if / else para ejecutar una de las dos opciones dependiendo de si la cadena existe o no.

¿Cuál es la sintaxis de BASH para la instrucción if?

if [ ????? ]; then
  #do one thing
else
  #do another thing
fi

Respuestas:


205

De grep --help, pero también ver man grep :

El estado de salida es 0 si se seleccionó alguna línea, 1 de lo contrario; Si se produce algún error y no se proporcionó -q, el estado de salida es 2.

if grep --quiet MYSQL_ROLE=master /etc/aws/hosts.conf; then
  echo exists
else
  echo not found
fi

Es posible que desee utilizar una expresión regular más específica, como ^MYSQL_ROLE=master$, para evitar esa cadena en los comentarios, nombres que simplemente comienzan con "maestro", etc.

Esto funciona porque el if toma un comando y lo ejecuta, y usa el valor de retorno de ese comando para decidir cómo proceder, con cero significa verdadero y no cero significa falso, al igual que la forma en que el shell interpreta otros códigos de retorno, y lo contrario de un lenguaje como C.


> con cero que significa verdadero y que no es cero que significa falso: lo mismo que la forma en que el shell interpreta otros códigos de retorno y lo opuesto a un lenguaje como C. pero ¿por qué lo contrario ...?
— kchoi

Debido a que un cero generalmente se interpreta como "sin error", mientras que cualquier otra cosa significa "algún error". Si se supone, queremos saber si el comando se completó correctamente.
— Timelmer


23

Tenga en cuenta que, por PIPEser cualquier comando o secuencia de comandos, entonces:

if PIPE ; then
  # do one thing if PIPE returned with zero status ($?=0)
else 
  # do another thing if PIPE returned with non-zero status ($?!=0), e.g. error
fi 

Para el registro, [ expr ]es una concha † abreviada para test expr.

Dado que grepdevuelve el estado 0 en caso de una coincidencia, y el estado distinto de cero en caso de que no haya coincidencias, puede usar:

if grep -lq '^MYSQL_ROLE=master' ; then 
  # do one thing 
else 
  # do another thing
fi 

Tenga en cuenta el uso del -lcual solo le importa que el archivo tenga al menos una coincidencia (de modo que grepregrese tan pronto como encuentre una coincidencia, sin continuar analizando innecesariamente el archivo de entrada).

† en algunas plataformas [ expr ]no es una orden interna, sino un ejecutable real /bin/[(cuyo argumento última será ]), por lo que [ expr ]debe contener espacios en blanco alrededor de los corchetes, y por qué debe ser seguido por uno de los separadores de lista de comandos ( ;, &&, ||, |, &, nueva línea)


44
-les redundante, grepregresa inmediatamente al encontrar una coincidencia con-q
— Vuelva a instalar Monica Please

3

solo usa bash

while read -r line
do
  case "$line" in
    *MYSQL_ROLE=master*)
       echo "do your stuff";;
    *) echo "doesn't exist";;      
  esac
done <"/etc/aws/hosts.conf"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.