Pido disculpas de antemano si esta es una pregunta duplicada. Hice un esfuerzo para buscar / verificar antes de preguntar aquí.
Me siento cómodo escribiendo frases sencillas como esta:
foocommand && foocommand2 && foocommand3
La idea es que solo quiero que se ejecuten comandos posteriores si el anterior fue "exitoso".
Estoy escribiendo un guión algo largo y esta frase no es factible porque parece un gran bloque de código confuso para todos los demás.
Quiero espaciar los comandos y escribir comentarios entre ellos en el script. ¿Cómo puedo hacer esto y aún tener el equivalente de && allí?
&&
no significa que el comando posterior se ejecutará si el anterior se ha realizado correctamente. Significa que el comando se ejecutará si el resultado colectivo de todos los comandos anteriores en la lista de comandos es exitoso. Puede saber esto, pero los futuros lectores pueden malinterpretar.||
y&&
(en oposición a|
o&
) se llama cortocircuito. El comportamiento utilizado con estos últimos operadores se llama evaluación entusiasta.a && b && c
solo se ejecutaráb
sia
tiene éxito, por lo que "solo se ejecutac
sib
tiene éxito" y "solo se ejecutac
sia
yb
ambos tienen éxito" son declaraciones equivalentes:b
no puede tener éxito a menos que tengaa
éxito.a || b && c
es más ilustrativo.true || false && echo hi
saldráhi
. La especificación dice: Los operadores "&&" y "||" tendrá la misma precedencia y se evaluará con asociatividad izquierda.Respuestas:
Puedes hacerlo así:
Espero haber entendido lo que preguntaste correctamente.
fuente
Puede cambiar la línea shebang a
Después de cualquier error, el script se detendrá.
fuente
bash
parte, por supuesto). El shell POSIX toma un montón de opciones que son aplicables aset
. ¿O viceversa?set
es una forma de configurar las opciones de línea de comandos de shell dentro del script-e
pueden comportarse mal. Por ejemplo, probablemente no desee que su script termine cada vez quediff
dos archivos no idénticos. Puede, por supuesto, solucionar esto agregando|| true
(o tal vez|| [ $? = 1 ]
) a tales comandos, pero el OP menciona a "todos los demás" que tendrán que leer este script, y dijo que "todos los demás" probablemente no estén acostumbrados a tener que hacer frente-e
.-e
she-bang, hasta que un administrador de mi compañía siguió lanzando mis scriptsbash myscript.sh
, por lo que ignoró el-e
. Ahora todos mis guiones tienen unset -e
en la segunda línea.Si no te gusta la
set -e
idea, tal vez puedas invertir la lógica.Más útil, reemplace
exit
con algo para imprimir un mensaje de error útil, luego salga. Dentro de una función, por supuesto, quieres enreturn
lugar deexit
.fuente
foocommand || exit
para salir confoocommand
el estado de salida si no es cero.Puedes usar
if else fi
bloques en su lugar.Es un poco más legible.
Alternativamente, puede usar
\
para dividir su gran liner en varias líneasPero, por supuesto, esto puede ser confuso para el ojo inexperto.
fuente
\
sea necesario allí.Podría considerar el uso de
if
declaraciones anidadas . Otra opción es usar rizados para agrupar como{ true && echo hi; } || echo huh
Actualización 1:
Aquí hay un ejemplo sin saltos / comentarios:
fuente
Divide cada secuencia de comandos en funciones:
fuente
Siempre me gusta escribir una función de "falla" que me permite especificar lo que iba a hacer cuando ocurrió la falla y luego usar el
||
patrón. Como el siguiente:fuente