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.