scripts script que programacion ejercicios ejemplo ejecutar linux bash shell if-statement unix error-handling

linux - script - Cómo verificar el estado de salida usando una instrucción if



que es un script en bash (6)

Alternativa a la declaración if explícita

Mínimamente:

test $? -eq 0 || echo "something bad happened"

Completar:

EXITCODE=$? test $EXITCODE -eq 0 && echo "something good happened" || echo "something bad happened"; exit $EXITCODE

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.


La answer de es correcta.

Si desea ir un paso más allá, lo uso en mi PS1 para ver el código de salida de cada comando solo si es un error:

function ret_validate { if [ $1 != 0 ] ; then echo -n -e " Err:$1" ; fi } PS1=''${debian_chroot:+($debian_chroot)}[/t]/[/033[01;32m/]/u@/h/[/033[00m/]:/[/033[01;34m/]/w/[/033[00m/]/[/e[01;31m/]`ret_validate /$?`/[/e[m/] /$ ''

Simplemente agregue esas líneas a su .bashrc si desea verlo.


Solo para agregar a la útil y detallada answer :

Si tiene que verificar el código de salida explícitamente, es mejor usar el operador aritmético, (( ... )) , de esta manera:

run_some_command (($? != 0)) && { printf ''%s/n'' "Command exited with non-zero"; exit 1; }

O use una declaración de case :

run_some_command; ec=$? # grab the exit code into a variable so that it can # be reused later, without the fear of being overwritten case $ec in 0) ;; 1) printf ''%s/n'' "Command exited with non-zero"; exit 1;; *) do_something_else;; esac

Respuesta relacionada sobre el manejo de errores en Bash:

  • Elevar error en un script Bash

Tenga en cuenta que los códigos de salida! = 0 se utilizan para informar un error. Entonces, es mejor hacer:

retVal=$? if [ $retVal -ne 0 ]; then echo "Error" fi exit $retVal

en lugar de

# will fail for error codes > 1 retVal=$? if [ $retVal -eq 1 ]; then echo "Error" fi exit $retVal


$? es un parámetro como cualquier otro. Puede guardar su valor para usar antes de llamar a exit .

exit_status=$? if [ $exit_status -eq 1 ]; then echo "blah blah blah" fi exit $exit_status


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 script salga cuando esa prueba devuelva verdadero (el comando anterior falló), entonces ponga la exit 1 (o lo que sea) dentro de ese bloque if después del echo .

Dicho esto, si está ejecutando el comando y desea probar su salida utilizando lo siguiente, a menudo es más sencillo.

if some_command; then echo command returned true else echo command returned some error fi

¡O para darle la vuelta al uso ! por negación

if ! some_command; then echo command returned some error else echo command returned true fi

Sin 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 marcar $? a mano.