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 && csolo se ejecutarábsiatiene éxito, por lo que "solo se ejecutacsibtiene éxito" y "solo se ejecutacsiaybambos tienen éxito" son declaraciones equivalentes:bno puede tener éxito a menos que tengaaéxito.a || b && ces más ilustrativo.true || false && echo hisaldrá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
bashparte, por supuesto). El shell POSIX toma un montón de opciones que son aplicables aset. ¿O viceversa?setes una forma de configurar las opciones de línea de comandos de shell dentro del script-epueden comportarse mal. Por ejemplo, probablemente no desee que su script termine cada vez quediffdos 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.-eshe-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 -een la segunda línea.Si no te gusta la
set -eidea, tal vez puedas invertir la lógica.Más útil, reemplace
exitcon algo para imprimir un mensaje de error útil, luego salga. Dentro de una función, por supuesto, quieres enreturnlugar deexit.fuente
foocommand || exitpara salir confoocommandel estado de salida si no es cero.Puedes usar
if else fibloques 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
ifdeclaraciones anidadas . Otra opción es usar rizados para agrupar como{ true && echo hi; } || echo huhActualizació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