Me cuesta entender por qué lo siguiente devuelve un código de 1.
echo 'Total' | grep -c No
0
Así "No" doesn't existe en "Total". Pero luego buscando su código de retorno i'm verlo como 1.
echo $?
1
¿Por qué el código de retorno aparece como 1? ¿Hay alguna manera de evitar esto?
Según la página man grep
, la bandera -c
es para
-c, --count Suprime la salida normal; en su lugar imprime un recuento de líneas coincidentes para cada fichero de entrada.
Así que lo que estás viendo es el recuento de la coincidencia y no debe confundirse con el código de salida de la coincidencia grep
. El código 1
se debe a que no hay líneas coincidentes en la entrada.
Echa un vistazo al otro caso,
echo 'No' | grep -c No
1
echo $?
0
También para leer en EXIT CODES
en man grep
página,
ESTADO DE SALIDA Normalmente el estado de salida es 0 si se ha seleccionado una línea, 1 si no se ha seleccionado ninguna línea y 2 si se ha producido un error.
El código de salida es 1 porque grep no ha encontrado nada. ESTADO DE SALIDA
El estado de salida es 0 si se encuentran las líneas seleccionadas, y 1 si no se encuentran. Si ocurrió un error el estado de salida es 2. (Nota: El manejo de errores POSIX el código debe comprobar para '2' o mayor).
La salida es cero porque la cuenta de 'Total' es cero. Esto se debe a la opción -c: -c, --count Suprime la salida normal; en su lugar imprime un recuento de líneas coincidentes para cada archivo de entrada. Con la opción -v, --invert-match (véase más abajo), cuenta las líneas no coincidentes. (-c está especificado por POSIX).
Si desea forzar un código de salida 0, puede añadir || true
a su comando:
echo 'Total' | grep -c No || true