Aquí se muestra el uso de ||
y &&
en una sola línea para concatenar la ejecución de comandos: ¿Cómo puedo verificar si hay errores de apt-get en un script bash?
Estoy tratando de detener la ejecución de un script si falla una determinada condición,
p.ej
false || echo "Obvious error because its false on left" && exit
Aquí imprime Obvious error because its false on the left
y sale de la consola, que es lo que quería.
true || echo "This shouldn't print" && exit
Aquí, no hay impresión de eco, pero el exit
comando también se ejecuta, es decir, la consola está cerrada, ¿no debería exit
ejecutarse el comando porque el comando de eco de la derecha no se ejecutó? ¿O es por defecto una declaración considerada falsa en el lado izquierdo de un &&
operador?
Editar: debería haberlo mencionado antes, mi objetivo era hacer eco del error y salir si no estaba claro. wrt a mi caso específico de errores de captura al agrupar condiciones usando && y ||, @ bodhi.zazen respuesta resuelve el problema
La respuesta de @takatakatek deja más claro el control de flujo y los enlaces de la guía bash son excelentes
La respuesta de @muru tiene una buena explicación de por qué no usar set -e si desea que se generen mensajes de error personalizados con alternativas de uso de perl y trap, lo que creo que es una forma más sólida y me veo usándolo desde mi segundo script de bash en adelante.
fuente
Respuestas:
Probablemente quieras (como señaló Steeldriver)
De lo contrario, su script está leyendo uno condicional a la vez
aob y luego salir
Creo que quieres a o (b y salir)?
fuente
{ ... ; }
(como sugirió @steeldriver), de lo contrario, elexit
único sale del subshell y el shell principal continúa ejecutando el script.El problema es que || y && solo omite una estrofa posterior de una cadena de comandos cuando la condición falla. Si escribe una estructura de bloque completo, tiene mucho sentido. Lo que escribiste se convierte en esto:
Lo que quieres es esto:
Cuando utiliza los operadores condicionales de acceso directo de Bash, es mejor evitar mezclarlos. La lógica es mucho más fácil de entender mientras la escribe, y sus lectores apreciarán su buen estilo.
fuente
if ... then ... elif ... else ... fi
bloques completamente expresados . Sospecho que es posible que no sepa que Bash no tiene tipos booleanos verdaderos vistos en lenguajes más sofisticados. Si el estado de salida de un comando es 0 (cero), Bash lo trata como verdadero / exitoso . Si el estado de salida no es cero, Bash lo trata como falso / error .La forma más sencilla de fallar en caso de error es usar la
-e
opción de bash (set -e
o/bin/bash -e
en el shebang). Sin embargo, esto no facilita el envío de mensajes de error personalizados. Hay un par de expresiones idiomáticas que podrían simplificarlo:die
à la PerlPerl tiene un
die
comando muy conveniente que imprime un mensaje en stderr y genera una excepción, que generalmente lleva a que finalice el script. Puedes emular esto:trap
ERR
El
trap <command>
comando se puede usar para ejecutar un comando cuando se recibe una señal, o al salir del script (trap ... EXIT
), o cuando un comando devuelve un error (trap ... ERR
). Entonces algo como:Entonces:
En cualquier caso, sugeriría usar al menos
exit 1
, para indicar que el script falló . Un planoexit
utilizará el estado de salida del comando anterior, que en estos casos serían los comandosecho
oprintf
, que generalmente tendrían éxito. Guardar el estado de salida del comando que falla como lo he hecho aquí sería algo bueno.fuente
Podría intentar experimentar un poco comenzando el script con
El -e asegura que el script salga en el momento en que algo regrese falso. Una falla específica se puede evitar con
something || true
fuente