
Escribí un script para ejecutar algunos comandos de Linux y capturar las excepciones en una cláusula if y generar los resultados. Básicamente, cada una de las variables en el siguiente extracto del código representa el estado de ejecución del comando y quiero salir del script correctamente si todos los comandos se ejecutan correctamente. De lo contrario quiero salir con uno. Mientras probaba el script que había creado intencionalmente, el comando falló y el resultado de una variable, por ejemplo X8, es 1. En este escenario, lo siguiente no funciona como se esperaba. Me muestra el mensaje de éxito en lugar del mensaje de error del script. No estoy seguro de por qué
if [ $X1 != 0 ] && [ $X2 != 0 ] && [ $X3 != 0 ] && [ $X4 != 0 ] && [ $X5 != 0 ] && [ $X6 != 0 ] && [ $X7 != 0 ] && [ $X8 != 0 ];
then echo "script failed"; exit 1;
else echo "success"; fi;
Respuesta1
En la parte superior de tu script, agrega esto:
trap 'echo "Error $? at $LINENO; aborting." 1>&2; exit $?' ERR
Luego, cada vez que algo arroje un error no detectado, el script saldrá con el mensaje anterior y saldrá con el código de salida del error. Puede cambiar $?
a 1
si realmente desea utilizar un código de salida de 1 para cualquier error.
Respuesta2
En primer lugar, estás utilizando [
cuál es la abreviatura de test
. De man test
:
STRING1 != STRING2 the strings are not equal
Estás utilizando la herramienta incorrecta para el trabajo. Lo que necesitas es
INTEGER1 -eq INTEGER2 INTEGER1 is equal to INTEGER2
En segundo lugar, tienes varias condiciones para probar aquí. En lugar de utilizar una declaración if larga, intente sumar el resultado de cada variable, como sugirió Glenn en los comentarios, y pruébelo. Alternativamente, evalúe el resultado de cada comando inmediatamente después de que exista. No tiene sentido ejecutar otros, si vas a salir porque ese comando sale de todos modos.
Aquí hay un enfoque de bucle:
for i in $X1 $X2 $X3 ;
do
[ $i -ne 0 ] && { echo "something failed"; exit 1; }
done
echo "Everything OK"
El truco aquí es que estás haciendo la misma prueba para todas y cada una de las variables, y si esa prueba falla, el script nunca llegará a la parte "Todo bien".