El caso no funciona al examinar la salida de “tail”.
No puedo encontrar las razones por las cuales mi declaración case
no funciona al examinar la salida de tail.
tail -F -n1 /var/log/pihole.log |
while read input; do
echo "$input" | hexdump -C # solo para comparar físicamente la salida
case $input in
cached|blacklisted|blocked)
echo "¡Hemos encontrado una coincidencia!";;
*)
echo "¡Sin coincidencia!"
esac
done
Esto siempre retorna “Sin coincidencia”, incluso si las cadenas están en $input
.
:~ $ ./pihole_test.sh
00000000 4a 61 6e 20 31 20 31 31 3a 35 35 3a 35 38 20 64 |Jan 1 11:55:58 d|
00000010 6e 73 6d 61 73 71 5b 36 39 36 5d 3a 20 65 78 61 |nsmasq[696]: exa|
00000020 63 74 6c 79 20 62 6c 61 63 6b 6c 69 73 74 65 64 |ctly blacklisted|
00000030 20 70 6c 61 79 2e 67 6f 6f 67 6c 65 2e 63 6f 6d | play.google.com|
00000040 20 69 73 20 30 2e 30 2e 30 2e 30 0a | es 0.0.0.0.|
0000004c
¡Sin coincidencia!
davy.ai
El problema con la declaración
case
que no funciona en este script podría deberse al hecho de quetail
está configurado para monitorear continuamente el archivo de registro y enviar nuevas líneas al buclewhile
. Esto significa que la declaracióncase
no recibe toda la línea como$input
, sino solo una parte de cada línea a medida que es enviada portail
.Para solucionar esto, podemos modificar el script para que espere hasta que se haya recibido toda la línea antes de aplicar la declaración
case
. Esto se puede lograr utilizando la opción-r
conread
, que permite que las barras invertidas se lean como parte de la línea. También podemos agregar una verificación para asegurarnos de que la línea no esté vacía antes de aplicar la declaracióncase
.Aquí hay una versión actualizada del script:
Con estas modificaciones, la declaración
case
ahora debería funcionar como se espera, y el script solo aplicará la declaracióncase
una vez que se haya recibido toda la línea.