bash - que - shell script leer fichero y extraer lineas
¿Cómo uso una comparación grep de archivos dentro de una instrucción bash if/else? (5)
Desde grep --help
, pero también vea man grep :
El estado de salida es 0 si se seleccionó alguna línea, 1 en caso contrario; si ocurre algún error y no se dio -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, los nombres que simplemente comienzan con "master", 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 otros códigos de retorno interpretados por el shell, y lo contrario de un lenguaje como C.
Cuando aparezca nuestro servidor, debemos 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
Entonces, queremos probar si esa cadena existe y usar una instrucción if / else para ejecutar una de dos opciones dependiendo de si la cadena existe o no.
¿Cuál es la sintaxis de BASH para la declaración if?
if [ ????? ]; then
#do one thing
else
#do another thing
fi
Tenga en cuenta que, para PIPE
es 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 un shell incorporado † taquigrafía para test expr
.
Como grep
regresa con 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 de -l
que solo le importa que el archivo tenga al menos una coincidencia (de modo que grep
regrese tan pronto como encuentre una coincidencia, sin continuar analizando innecesariamente el archivo de entrada).
† en algunas plataformas [ expr ]
no es un built-in, sino un ejecutable real /bin/[
(cuyo último argumento será ]
), por lo que [ expr ]
debe contener espacios en blanco entre los corchetes, y por qué debe ser seguido por uno de los separadores de lista de comandos ( ;
, &&
, ||
, |
, &
, newline)
Tratar:
if [ -n "`grep /"MYSQL_ROLE=master/" /etc/aws/hosts.conf`" ]; then
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"
if
toma un comando y verifica su valor de retorno. [
es solo un comando.
if grep -q ...
then
....
else
....
fi