Me preguntaba cuál sería la mejor manera de verificar el estado de salida en una declaración if para hacer eco de una salida específica.
Estoy pensando en que sea
if [ $? -eq 1 ]
then
echo "blah blah blah"
fi
El problema que también tengo es que la declaración de salida es anterior a la declaración if simplemente porque tiene que tener ese código de salida. Además, sé que estoy haciendo algo mal ya que la salida obviamente saldría del programa.
bash
shell
if-statement
error-handling
deadcell4
fuente
fuente

some_program; rc=$?; if [ ${rc} -eq 1 ] .... fi ; exit ${rc}Respuestas:
Cada comando que se ejecuta tiene un estado de salida.
Esa verificación está mirando el estado de salida del comando que terminó más recientemente antes de que se ejecute esa línea.
Si desea que su secuencia de comandos salga cuando esa prueba devuelva verdadero (el comando anterior falló), entonces ponga
exit 1(o lo que sea) dentro de eseifbloque después deecho.Dicho esto, si está ejecutando el comando y desea probar su salida utilizando lo siguiente, a menudo es más sencillo.
O para cambiar eso, usarlo
!para la negaciónSin embargo, tenga en cuenta que a ninguno de esos le importa cuál es el código de error. Si sabe que solo le importa un código de error específico, entonces debe verificarlo
$?manualmente.fuente
a_command || return 1returnsolo funciona en una función y un script de fuente. Necesitaexitpara el otro caso (que hace demasiado en una función y un script de origen). Pero sí, ese es ciertamente un patrón razonable si no necesita ninguna limpieza específica o salida adicional.dash, el shell predeterminado no interactivo en muchas distribuciones modernas de Linux, no se preocupa por la distinción entrereturnyexitdentro de los scripts de shell ejecutados.dashsale del script incluso si lo usoreturnen él.if <command>pasa si el código de salida es 0. En cualquier otro idioma sería al revésif ! some_command | some_other_commandignorará el estado de some_command. Las dos soluciones alternativas de comando sonset -o pipefail(puede cambiar la funcionalidad en otras partes de su programa) o mover laifdeclaraciónif [[ ${PIPESTATUS[0]} -ne 0 ]]como un comando de seguimiento separado (feo, pero funcional). Si está utilizando,set -eentonces también querrá agregar|| trueal final de la tubería cuando use la segunda solución, ya que eliminar la tubería del flujo de control ofrecido poriflo contrario provocaría que salga inmediatamente.Tenga en cuenta que los códigos de salida! = 0 se utilizan para informar un error. Entonces, es mejor hacer:
en vez de
fuente
dnf check-updatedevuelve 0 (sin actualizaciones), 100 (actualizaciones disponibles) o 1 (error).dnfdesarrolladores han elegido de esta manera, es su elección. Pero aún así, su elección no hace que la especificación se rompa :)$?es un parámetro como cualquier otro. Puede guardar su valor para usar antes de llamar en última instanciaexit.fuente
Alternativa a la
ifdeclaración explícitaMínimamente:
test $? -eq 0 || echo "something bad happened"Completar:
fuente
Solo para agregar a la útil y detallada respuesta :
Si tiene que verificar el código de salida explícitamente, es mejor usar el operador aritmético
(( ... )), de esta manera:O use una
casedeclaración:Respuesta relacionada sobre el manejo de errores en Bash:
fuente