У меня есть скрипт оболочки с вложенными циклами, и я только что узнал, что «выход» на самом деле не завершает скрипт, а только текущий цикл. Есть ли другой способ полностью выйти из сценария при определенном состоянии ошибки?
Я не хочу использовать "set -e", потому что есть допустимые ошибки, и это потребует слишком много переписывания.
Прямо сейчас я использую kill для ручного уничтожения процесса, но, похоже, должен быть лучший способ сделать это.
bash -c 'for x in y z; do exit; done; echo "This never gets printed"'
.Ответы:
Ваша проблема не в вложенных циклах как таковых. Это то, что один или несколько ваших внутренних циклов работает в подоболочке .
Это работает:
выход:
Это представляет проблему, которую вы описали:
выход:
Вот решение; Вы должны проверить возвращаемое значение внутренних циклов, которые работают в подоболочках:
Обратите внимание на тест:
[[ $? != 0 ]] && exit $?
выход:
Редактировать: чтобы проверить, в какой подоболочке вы находитесь, измените скрипт «answer», чтобы сообщить вам идентификатор процесса вашей текущей оболочки. ПРИМЕЧАНИЕ: это работает только в bash 4:
выход:
Переменные «i» и «j» предоставлены вам с разрешения Fortran. Хорошего дня. :-)
источник
bash --version
в командной строке.Ранее ответ предлагает использовать ,
[[ $? != 0 ]] && exit $?
однако это не совсем работа , как и следовало ожидать, потому что[[ $? != 0 ]]
тест будет сброшен$?
в ноль, что означает , что , хотя сценарий будет рано выйти , как ожидается, он будет всегда выход с кодом 0 (не ожидается) , Кроме того, было бы лучше использовать-ne
тест сравнения чисел, а не!=
тест сравнения строк. Поэтому, ИМХО, лучшим решением будет использовать:поскольку это гарантирует, что фактический код выхода установлен правильно.
источник
Вы можете использовать
break
.От
help break
:Таким образом, для выхода из трех замкнутых циклов, т.е. если у вас есть два вложенных цикла внутри основного, используйте это для выхода из всех них:
источник
for((i=0;i<3;i++));do echo A;for((j=0;j<2;j++));do echo B;break 2;done;done
exit
завершает всю оболочку или текущую вложенную оболочку:источник