Сокращение в цикле

PARAMS+=" param1"
if [[ $CONDITION == "true" ]]; then  
  PARAMS+=" --param2"
fi
script ${PARAMS}
2
18.07.2019, 03:32
3 ответа

Статус выхода из цикла соответствует статусу последней выполненной в нем команды, то есть 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, как указано выше, и проверить его значение вне цикла.

1
27.01.2020, 22:16

Цикл for name in...передает статус выхода последней выполненной команды.

Когда вы breakвыполняете цикл, сама команда breakимеет статус выхода 0 по умолчанию, который, следовательно, передается for, что делает ваш &&тест после doneравным к true.

Один из способов обойти это, как вы сказали в своем -ответе. Это хороший и чистый вариант, и он хорошо работает с любой оболочкой, совместимой с POSIX.

Но у него есть один недостаток: будучи вспомогательной -оболочкой,он не полностью разделяет свою Execution Environment1 со своей "внешней" оболочкой. Он наследует его в начале выполнения, но не «распространяет» его обратно на своего «внешнего» родителя при завершении выполнения, что означает, например, что любая переменная, установленная или измененная в цикле, не будет видна после вне цикла.

Говоря о Bash, есть альтернатива :вы можете избежать оболочки sub -и по-прежнему использовать break, заставляя ее сбой, передавая ей аргумент -1, потому что -1всегда является недопустимое количество циклов для выхода. Bash отобразит для этого сообщение об ошибке, но вы можете отключить его, перенаправив на 2>/dev/null.

Однако обратите внимание, что такое поведение не совсем совместимо с POSIX, поскольку breakсчитаетсяспециальной сборкой -ви «специальной встроенной -в», вызывающей ошибку . ] должен выйти из не -не интерактивной оболочки (, например скрипт ).

1 [...]. Изменения, внесенные в среду подоболочки , не могут повлиять на среду выполнения оболочки . [...]

0
27.01.2020, 22:16

Я предпочитаю этот другому ответу (, каким бы полезным он ни был ), потому что он ближе к требованию, подразумеваемому в вопросе:

$ (for cond in {0,1,0}; do if [[ $cond = 0 ]]; then true; else false; exit; fi; done) && echo "true" || echo "false" false 
0
27.01.2020, 22:16

Теги

Похожие вопросы