2016-11-09 7 views
3

в:Я не понимаю команду останова

#!/bin/sh 

for var1 in 1 2 3 
do 
    for var2 in 0 5 
    do 
     if [ $var1 -eq 2 -a $var2 -eq 0 ] 
     then 
     break 2 
     else 
     echo "$var1 $var2" 
     fi 
    done 
done 

выход:

1 0 
1 5 

, а затем сценарий останавливается.

как всегда, если аргумент перерыв команды (в 2) удаляется, выход:

1 0 
1 5 
3 0 
3 5 

То, что я спрашиваю, почему 3 0 и 3 5 печатаются, когда сценарий обусловлен не сломаться? Сценарий не печатал 2 0 и 2 5 и 3 0 и 3 5 должен сигнализировать перерыв, а также ...

+1

'break 2' остановит внутренний и внешний контуры. 'break 1' aka' break' только остановит внутренний цикл (внешний цикл будет продолжен на следующей итерации). Чтобы остановить весь скрипт, используйте 'exit' –

+0

спасибо за комментарий, но я до сих пор не понимаю, почему' 3 0' и '3 5' являются выходами? оба из них должны активировать перерыв, точно так же, как '2 0' и' 2 5' – KOOLz

+0

. Ваше условие - '$ var1 -eq 2 -a $ var2 -eq 0', а' 3 0' не равно '2 0 '. Вы имели в виду использовать '-gt' для" больше чем "вместо этого? Если вы захотите остановить весь скрипт, достигнув '2 0' и не продолжите ничего, вы можете использовать' exit' (или 'break 2', чтобы закончить обе петли, как вы это сделали) –

ответ

1

Суммируя комментарии, были два вопроса:

  • Почему 3 0 напечатанных после break, но не после того, как break 2?

Это было связано с тем, что условие ([ $var1 -eq 2 -a $var2 -eq 0 ]) проверено на равенство, а не -ge, большее или равное. С -ge не будет echo s, где оба числа больше.

break 2 вместо этого вышел из обеих петель, тем самым давая тот же эффект в этом конкретном случае. Если петля была for var1 in 1 2 0, break 2 также предотвращало бы появление 0 0, поскольку обе петли были бы остановлены.

  • Почему 2 5 не печатается после brake?

Это происходит потому, что вся внутренняя петля останавливается на break, поэтому никаких других итераций не будут иметь свой шанс echo. Чтобы вместо этого пропустить текущую итерацию и немедленно попробовать следующую, используйте continue.

0

только простой break прорывается из одной петли - внутренний цикл в вашем случае. Однако, если вы используете дополнительное целочисленное выражение в инструкции break, как в break 2, затем вырывается из указанного числа циклов - то есть два для петель в вашем случае. Поскольку существует не более двух вложенных циклов, и после самого внешнего цикла кода больше нет кода, он фактически совпадает с завершением сценария.

1

Необязательный аргумент break указывает, какой цикл вырваться из. Если аргумент опущен, он выходит из самого внутреннего цикла. С аргументом n он вырывается из замкнутого контура n.

Так break 2 вырывается из цикла for var1, потому что это второй замкнутый контур. Если вы измените его на break, он просто выйдет из цикла for var2, поэтому он перейдет к следующей итерации for var1.

 Смежные вопросы

  • Нет связанных вопросов^_^