2015-08-25 2 views
2

Я относительно новый с bash (программирование в целом) и сам по себе обучен по большей части, но у меня есть цикл while, который должен только выйти, если ВСЕ условия выполнены.bash while loop break too early

while [[ "$var1" != "$var1_tgt" ]] && [[ "var2" != "$var2_tgt" ]] && [[ "$var3" != "$var3_tgt" ]] && [[ "$var4" != "$var4_tgt" ]]; do LOOP...; done 

Проблема в том, что у меня, кажется, есть (я думаю), находится в оценке цикла. Когда я запускаю скрипт, он прерывается, если выполняется только одно из условий, но я хочу, чтобы цикл прерывался только тогда, когда были выполнены ВСЕ условия. То есть, когда var # равно var # _tgt для ВСЕХ var, только тогда цикл должен прерываться. Насколько я знаю, использование «& &» должно означать, что все условия должны быть выполнены до того, как цикл выйдет, но тот факт, что он не работает, означает, что я чего-то не хватает. Я ценю любую помощь в этом.

+0

Не могли бы вы помочь нам понять, что делает этот сценарий? Например, вы предположительно начинаете с '$ var2_tgt' соответствия' $ var' и '$ var2_tgt', соответствующих' $ var2', тогда по мере прохождения по циклу одна или несколько переменных будут изменены, чтобы они больше не соответствовали цель. И если они не совпадают, вы выходите из цикла. У меня есть это право? Если да, можете ли вы предоставить нам пример кода, который устанавливает переменные, чтобы мы могли проверить, как все работает? – ghoti

ответ

1

Вам нужно изменить цикл для:

while [[ "$var1" != "$var1_tgt" ]] || [[ "var2" != "$var2_tgt" ]] || [[ "$var3" != "$var3_tgt" ]] || [[ "$var4" != "$var4_tgt" ]]; do LOOP...; done 

Поскольку вы хотите продолжить цикл, если любой переменных еще не в их цели.

В противном случае, как только одна из переменных достигнет цели, одно из условий будет терпеть неудачу, и цикл сломается.

+0

Я предположил, что он хочет продолжить цикл до тех пор, пока переменные все еще находятся в их цели. Как только переменная перестает мигать, цикл должен выйти. – ghoti

+0

Если я понимаю, о чем смущает JollyRoger, это правильный ответ. Я считаю, что он рассматривает условие 'while' как условие * выхода * для цикла, но это на самом деле условие * don't-exit *. Таким образом, он получил «и» против »или« назад ». –

+0

Я ответил, основываясь на «когда var # равно var # _tgt для ВСЕХ var's, только тогда, когда цикл прерывается», который, я думаю, я правильно прочитал? – michaelrccurtis