скрипт оболочки, если условие не работает так, как ожидалось

скрипт оболочки, если условие не работает так, как ожидалось

Я написал скрипт для запуска некоторых команд 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"

Хитрость здесь в том, что вы проводите один и тот же тест для каждой из переменных, и если этот тест не пройден, скрипт никогда не дойдет до части «Все в порядке».

Связанный контент