PARAMS+=" param1"
if [[ $CONDITION == "true" ]]; then
PARAMS+=" --param2"
fi
script ${PARAMS}
Статус выхода из цикла соответствует статусу последней выполненной в нем команды, то есть echo
или break
, и обе они обычно имеют статус выхода 0. Поэтому вам необходимо сохранять и проверять статус цикла. условие. Я бы предложил использовать функцию:
loopcheck() {
for cond in {0,1,0}; do
if [[ $cond = 0 ]]; then
echo 0;
else
ret=$?; # preserve exit status of test
echo 1;
return $ret; # pass it on
fi;
done
}
loopcheck && echo "true" || echo "false"
Другой вариант — сохранить $ret
, как указано выше, и проверить его значение вне цикла.
Цикл for name in...
передает статус выхода последней выполненной команды.
Когда вы break
выполняете цикл, сама команда break
имеет статус выхода 0 по умолчанию, который, следовательно, передается for
, что делает ваш &&
тест после done
равным к true
.
Один из способов обойти это, как вы сказали в своем -ответе. Это хороший и чистый вариант, и он хорошо работает с любой оболочкой, совместимой с POSIX.
Но у него есть один недостаток: будучи вспомогательной -оболочкой,он не полностью разделяет свою Execution Environment1 со своей "внешней" оболочкой. Он наследует его в начале выполнения, но не «распространяет» его обратно на своего «внешнего» родителя при завершении выполнения, что означает, например, что любая переменная, установленная или измененная в цикле, не будет видна после вне цикла.
Говоря о Bash, есть альтернатива :вы можете избежать оболочки sub -и по-прежнему использовать break
, заставляя ее сбой, передавая ей аргумент -1
, потому что -1
всегда является недопустимое количество циклов для выхода. Bash отобразит для этого сообщение об ошибке, но вы можете отключить его, перенаправив на 2>/dev/null
.
Однако обратите внимание, что такое поведение не совсем совместимо с POSIX, поскольку break
считаетсяспециальной сборкой -ви «специальной встроенной -в», вызывающей ошибку . ] должен выйти из не -не интерактивной оболочки (, например скрипт ).
1 [...]. Изменения, внесенные в среду подоболочки , не могут повлиять на среду выполнения оболочки . [...]