
Я написал скрипт для запуска некоторых команд Linux, захвата исключений в операторе if и вывода результатов. По сути, каждая из переменных в приведенном ниже фрагменте кода представляет статус выполнения команды, и я хочу успешно завершить работу скрипта, если все команды выполнены успешно. В противном случае я хочу завершить работу с одной из них. Во время тестирования скрипта я намеренно сделал так, чтобы команда не выполнялась, и вывод одной переменной, например X8, равен 1. В этом сценарии ниже работает не так, как ожидалось. Он показывает мне сообщение об успешном выполнении вместо сообщения о сбое скрипта. Не уверен, почему
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;
решение1
В верхней части вашего скрипта добавьте следующее:
trap 'echo "Error $? at $LINENO; aborting." 1>&2; exit $?' ERR
Затем, всякий раз, когда что-либо выдает неперехваченную ошибку, скрипт выключится с указанным выше сообщением и выйдет с кодом выхода ошибки. Вы можете изменить $?
на 1
, если вы действительно хотите использовать код выхода 1 для любой ошибки.
решение2
Прежде всего, вы используете , [
что является сокращением от test
. От man test
:
STRING1 != STRING2 the strings are not equal
Вы используете неподходящий инструмент для работы. Вам нужно
INTEGER1 -eq INTEGER2 INTEGER1 is equal to INTEGER2
Во-вторых, здесь у вас есть несколько условий для проверки. Вместо того, чтобы использовать один длинный оператор if, попробуйте суммировать вывод каждой переменной, как предложил glenn в комментариях, и протестируйте это. В качестве альтернативы оцените вывод каждой команды сразу после ее существования. Нет смысла запускать другие, если вы собираетесь выйти из-за вывода этой команды в любом случае.
Вот циклический подход:
for i in $X1 $X2 $X3 ;
do
[ $i -ne 0 ] && { echo "something failed"; exit 1; }
done
echo "Everything OK"
Хитрость здесь в том, что вы проводите один и тот же тест для каждой из переменных, и если этот тест не пройден, скрипт никогда не дойдет до части «Все в порядке».