¿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
usuario77413
fuente

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.


fuente
> 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
33

iftoma un comando y verifica su valor de retorno. [Es solo un comando.

if grep -q ...
then
  ....
else
  ....
fi
Ignacio Vazquez-Abrams
fuente
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)

vladr
fuente
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"
ghostdog74
fuente