Comprobación de si la salida de un comando contiene una determinada cadena en un script de shell
116
Estoy escribiendo un script de shell y estoy tratando de verificar si la salida de un comando contiene una determinada cadena. Estoy pensando que probablemente tenga que usar grep, pero no estoy seguro de cómo. ¿Alguien sabe?
¿El comando debe seguir ejecutándose después de generar la cadena de salida que está buscando o puede cerrarse inmediatamente en ese momento? (Sus dos respuestas difieren en términos de su semántica a este respecto).
Además, no grep 'string' &>/dev/nulles compatible con POSIX y es mucho más lento de ejecutar (si stringaparece temprano en un flujo de salida largo) que grep -q string. [La advertencia que hay que hacer es asegurarse de que se somecommandsiga ejecutando incluso después de emitir string, en cuyo caso usar grep -q, cerrando su stdin y saliendo después de que stringse vea la primera instancia de , puede ser contraproducente]. (Re: "no compatible con POSIX", &>es una extensión; consulte pubs.opengroup.org/onlinepubs/009695399/utilities/… que describe el soporte de redireccionamiento obligatorio de POSIX).
Charles Duffy
Ayudaría si se explicara por qué funciona / qué hace cada parámetro, para fomentar la comprensión completa de la sintaxis
Si por casualidad solo desea probar una cadena fija, agregue las opciones F y x : grep -FxqF significa fijo (no interpretado) yx para toda la línea
Erdal G.
4
¿Por qué probar $?es anti-patrón?
Vitaly Zdanevich
1
@VitalyZdanevich Supongo que porque no es robusto contra la concurrencia.
Konrad Reiche
@VitalyZdanevich, por ejemplo, las pruebas $?no configuran los comandos anteriores como "comprobados" a los efectos de set -ela ERRtrampa, por lo que su programa puede salir en los casos en que desee que simplemente regrese por la ruta intencionalmente falsa más adelante. Por otro lado, $?es un estado global volátil: es fácil tirar su valor por accidente. Por ejemplo, si agrega una línea de registro como echo "Exit status is $?", el nuevo valor en se $?convierte en el estado de salida de echo.
Charles Duffy
6
Otra opción es verificar la coincidencia de expresiones regulares en la salida del comando.
Por ejemplo:
[["$(./somecommand)"=~"sub string"]]&& echo "Output includes 'sub string'"
Respuestas:
Pruebe el valor de retorno de grep:
que se hace idiomáticamente así:
y también:
fuente
=
ser un operador de comparación, no==
; ver pubs.opengroup.org/onlinepubs/9699919799/utilities/test.htmlgrep 'string' &>/dev/null
es compatible con POSIX y es mucho más lento de ejecutar (sistring
aparece temprano en un flujo de salida largo) quegrep -q string
. [La advertencia que hay que hacer es asegurarse de que sesomecommand
siga ejecutando incluso después de emitirstring
, en cuyo caso usargrep -q
, cerrando su stdin y saliendo después de questring
se vea la primera instancia de , puede ser contraproducente]. (Re: "no compatible con POSIX",&>
es una extensión; consulte pubs.opengroup.org/onlinepubs/009695399/utilities/… que describe el soporte de redireccionamiento obligatorio de POSIX).La prueba
$?
es un anti-patrónfuente
grep -Fxq
F significa fijo (no interpretado) yx para toda la línea$?
es anti-patrón?$?
no configuran los comandos anteriores como "comprobados" a los efectos deset -e
laERR
trampa, por lo que su programa puede salir en los casos en que desee que simplemente regrese por la ruta intencionalmente falsa más adelante. Por otro lado,$?
es un estado global volátil: es fácil tirar su valor por accidente. Por ejemplo, si agrega una línea de registro comoecho "Exit status is $?"
, el nuevo valor en se$?
convierte en el estado de salida deecho
.Otra opción es verificar la coincidencia de expresiones regulares en la salida del comando.
Por ejemplo:
fuente
Un script de shell condicional if / else limpio:
fuente