고급 Bash 스 크 립 트 프로 그래 밍 가이드 (16): 순환 과 분기

9022 단어 shell
고급 Bash 스 크 립 트 프로 그래 밍 가이드 (16): 순환 과 분기
견지했어
소켓 순환
내장 순환 은 하나의 순환 에 또 하나의 순환 이 있 는 것 입 니 다. 내부 순환 은 외부 순환 체 에 있 습 니 다. 외부 순환 의 매번 실행 과정 에서 내부 순환 이 끝 날 때 까지 내부 순환 을 촉발 합 니 다. 외부 순환 이 몇 번 실 행 했 는 지 내부 순환 이 몇 번 이 되 었 는 지 내부 순환 이 든 외부 순환 의 break 문 구 는 처리 과정 을 중단 합 니 다.
#!/bin/bash
# nested-loop.sh:    "for"  .

outer=1             #         .

#       .
for a in 1 2 3 4 5
do
  echo "Pass $outer in outer loop."
  echo "---------------------"
  inner=1           #         .

  # ===============================================
  #       .
  for b in 1 2 3 4 5
  do
    echo "Pass $inner in inner loop."
    let "inner+=1"  #         .
  done
  #       .
  # ===============================================

  let "outer+=1"    #          .
  echo              #            .
done
#       .

exit 0
결과:
root@ubuntu:~/resource/shell-study/0613-2013# chmod +x nested-loop.sh 
root@ubuntu:~/resource/shell-study/0613-2013# ls
nested-loop.sh
root@ubuntu:~/resource/shell-study/0613-2013# ./nested-loop.sh 
Pass 1 in outer loop.
---------------------
Pass 1 in inner loop.
Pass 2 in inner loop.
Pass 3 in inner loop.
Pass 4 in inner loop.
Pass 5 in inner loop.

Pass 2 in outer loop.
---------------------
Pass 1 in inner loop.
Pass 2 in inner loop.
Pass 3 in inner loop.
Pass 4 in inner loop.
Pass 5 in inner loop.

Pass 3 in outer loop.
---------------------
Pass 1 in inner loop.
Pass 2 in inner loop.
Pass 3 in inner loop.
Pass 4 in inner loop.
Pass 5 in inner loop.

Pass 4 in outer loop.
---------------------
Pass 1 in inner loop.
Pass 2 in inner loop.
Pass 3 in inner loop.
Pass 4 in inner loop.
Pass 5 in inner loop.

Pass 5 in outer loop.
---------------------
Pass 1 in inner loop.
Pass 2 in inner loop.
Pass 3 in inner loop.
Pass 4 in inner loop.
Pass 5 in inner loop.

root@ubuntu:~/resource/shell-study/0613-2013# 

순환 행동 에 영향 을 주 는 명령
break 와 contine 이라는 두 순환 제어 명령 은 다른 언어의 유사 한 명령 과 같은 행동 입 니 다.
break 명령 은 순환 을 뛰 어 넘 는 데 사 용 됩 니 다. contine 명령 은 이번 순환 의 나머지 코드 를 무시 하고 순환 의 다음 교체 에 들 어 갑 니 다.
인 스 턴 스 를 보고 설명 합 니 다. 먼저 contine 에 적용 되 고 출력 결 과 를 관찰 합 니 다.
#!/bin/bash

LIMIT=19  #   

echo "Printing Numbers 1 through 20 (but not 3 and 11)."

a=0

while [ $a -le "$LIMIT" ]
do
 a=$(($a+1))

 if [ "$a" -eq 3 ] || [ "$a" -eq 11 ]  #   3 11.
 then
   continue      #            .
 fi

 echo -n "$a "   #  $a  3 11   ,       .
done

echo 
exit 0
결과:
root@ubuntu:~/resource/shell-study/0613-2013# ./test1.sh 
Printing Numbers 1 through 20 (but not 3 and 11).
1 2 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 
root@ubuntu:~/resource/shell-study/0613-2013# 
같은 코드 입 니 다. contine 을 break 로 바 꾸 고 출력 결 과 를 다시 관찰 합 니 다.
#!/bin/bash

LIMIT=19  #   

echo "Printing Numbers 1 through 20 (but not 3 and 11)."

a=0

while [ $a -le "$LIMIT" ]
do
 a=$(($a+1))

 if [ "$a" -eq 3 ] || [ "$a" -eq 11 ]  #   3 11.
 then
   break      #            .
 fi

 echo -n "$a "   #  $a  3 11   ,       .
done

echo 
exit 0
결과:
root@ubuntu:~/resource/shell-study/0613-2013# ./test1.sh 
Printing Numbers 1 through 20 (but not 3 and 11).
1 2 
root@ubuntu:~/resource/shell-study/0613-2013#
break 는 프로그램 이 순환 에서 벗 어 나 고 그 후의 순환 과정 이 실 행 될 수 없다 는 것 을 설명 한다.
break 명령 은 매개 변 수 를 가 져 올 수 있 습 니 다. 매개 변수 가 없 는 break 명령 은 가장 안쪽 순환 만 종료 할 수 있 고 break N 은 N 층 순환 을 종료 할 수 있 습 니 다.
우선, 대비 로 break 를 사용 하여 인자 가 없 는 인 스 턴 스 를 먼저 봅 니 다.
#!/bin/bash

for outerloop in 1 2 3 4 5
do
  echo -n "Group $outerloop:   "

  # --------------------------------------------------------
  for innerloop in 1 2 3 4 5
  do
    echo -n "$innerloop "

    if [ "$innerloop" -eq 3 ]
    then
      break
    fi
  done
  # --------------------------------------------------------

  echo
done

echo

exit 0
결과:
root@ubuntu:~/resource/shell-study/0613-2013# chmod +x test2.sh 
root@ubuntu:~/resource/shell-study/0613-2013# ./test2.sh 
Group 1:   1 2 3 
Group 2:   1 2 3 
Group 3:   1 2 3 
Group 4:   1 2 3 
Group 5:   1 2 3 

root@ubuntu:~/resource/shell-study/0613-2013# 
내부 순환 은 판단 조건 이 요구 에 부합 할 때마다 이번 순환 을 끝내 고 새로운 순환 을 시작 합 니 다. 이때 break 는 파 라 메 터 를 가지 고 있 지 않 습 니 다. 기본적으로 한 층 의 순환 만 뛰 어 내 립 니 다. break 에 파 라 메 터 를 추가 하 는 방법 을 시도 해 보 세 요.
#!/bin/bash

for outerloop in 1 2 3 4 5
do
  echo -n "Group $outerloop:   "

  # --------------------------------------------------------
  for innerloop in 1 2 3 4 5
  do
    echo -n "$innerloop "

    if [ "$innerloop" -eq 3 ]
    then
      break 2
    fi
  done
  # --------------------------------------------------------

  echo
done

echo

exit 0
결과:
root@ubuntu:~/resource/shell-study/0613-2013# ./test2.sh 
Group 1:   1 2 3 
root@ubuntu:~/resource/shell-study/0613-2013# 

이 점 은 c 나 c++ 등 프로 그래 밍 언어 와 달리 c 에서 break 는 이러한 매개 변 수 를 가 진 용법 이 없습니다. c 언어 에서 break 문 구 는 보통 순환 문 과 스위치 문 에 사 용 됩 니 다.break 가 스위치 문 switch 에 사 용 될 때 프로그램 을 switch 에서 뛰 어 내 려 switch 이후 의 문 구 를 실행 할 수 있 습 니 다.브레이크 문구 가 없 으 면, 종료 할 수 없 는 순환 이 된다.break 는 switch 에서 의 용법 이 매우 흔 하 다.break 문 구 는 do - while, for, while 순환 문 구 를 사용 할 때 프로그램 이 순환 을 중지 하고 순환 뒤의 문 구 를 실행 할 수 있 습 니 다. 보통 break 문 구 는 if 문 구 를 연결 합 니 다.즉, 조건 을 만족 시 킬 때 순환 을 뛰 어 넘 는 것 이다.주의:
1) break 문 구 는 if - else 의 조건문 에 작용 하지 않 는 다.
2) 다 층 순환 중 하나의 break 문 구 는 밖으로 한 층 만 뛴다.contine 명령 도 break 명령 처럼 매개 변 수 를 가 져 올 수 있 습 니 다. 매개 변수 가 없 는 contine 명령 은 이번 순환 의 나머지 코드 만 제거 합 니 다. contine N 은 N 층 순환 의 나머지 코드 를 모두 제거 하지만 순환 횟수 는 변 하지 않 습 니 다.
break 에 비해 쉽게 이해 되 지 않 는 것 같은 데 왜 순환 횟수 가 변 하지 않 는 다 고 말 합 니까?실례 를 봅 시다!당신 이 이 말 을 이해 하 는 데 도움 이 됩 니 다.
#!/bin/bash
# "continue N"   ,   N       continue.

for outer in I II III IV V           #     
do
  echo; echo -n "Group $outer: "

  # --------------------------------------------------------------------
  for inner in 1 2 3 4 5 6 7 8 9 10  #     
  do

    if [ "$inner" -eq 7 ]
    then
      continue
    fi

	if [ "$inner" -eq 1 ]
	then
    	echo -n "	$inner "
	else
		echo -n "$inner "
	fi
  done
  # --------------------------------------------------------------------
  #    :        echo  ,        .
done

echo

exit 0
결과:
root@ubuntu:~/resource/shell-study/0613-2013# ./test3.sh 

Group I: 	1 2 3 4 5 6 8 9 10 
Group II: 	1 2 3 4 5 6 8 9 10 
Group III: 	1 2 3 4 5 6 8 9 10 
Group IV: 	1 2 3 4 5 6 8 9 10 
Group V: 	1 2 3 4 5 6 8 9 10 
root@ubuntu:~/resource/shell-study/0613-2013# 
여기 contine 에는 매개 변수 가 없습니다. 우 리 는 쉽게 이해 할 수 있 습 니 다. 매개 변수 가 없 는 contine 을 사용 하면 현재 순환 하 는 특정한 순환 을 뛰 어 넘 을 뿐 외부 순환 체 에 영향 을 주지 않 습 니 다. 지금 은 매개 변수 가 있 는 contine 을 사용 하여 어떤 모습 인지 볼 수 있 습 니 다.
#!/bin/bash
# "continue N"   ,   N       continue.

for outer in I II III IV V           #     
do
  echo; echo -n "Group $outer: "

  # --------------------------------------------------------------------
  for inner in 1 2 3 4 5 6 7 8 9 10  #     
  do

    if [ "$inner" -eq 7 ]
    then
      continue 2
    fi

	if [ "$inner" -eq 1 ]
	then
    	echo -n "	$inner "
	else
		echo -n "$inner "
	fi
  done
  # --------------------------------------------------------------------
  #    :        echo  ,        .
done

echo

exit 0
결과:
root@ubuntu:~/resource/shell-study/0613-2013# ./test3.sh 

Group I: 	1 2 3 4 5 6 
Group II: 	1 2 3 4 5 6 
Group III: 	1 2 3 4 5 6 
Group IV: 	1 2 3 4 5 6 
Group V: 	1 2 3 4 5 6 
root@ubuntu:~/resource/shell-study/0613-2013# 
얼핏 보면 이해 가 안 될 수도 있 지만 곧 다시 돌아 올 거 야. 이해 하기 쉬 워.
위의 인 스 턴 스 contine 테이프 의 매개 변 수 는 '2' 입 니 다. continue 를 만 났 을 때 먼저 가장 안쪽 순환 에서 메 시 지 를 받 고 이 순환 을 뛰 어 넘 었 습 니 다. 하지만 바깥쪽 순환 에서 말 을 했 습 니 다. 움 직 이지 마 세 요. 저도 소식 을 들 었 습 니 다. 제 가 무엇 을 하 라 고 하 는 지 보고 다시 말 하 겠 습 니 다. 바깥쪽 순환 이 어떻게 되 는 지 보 겠 습 니 다. 저 는 이번 순환 에서 벗 어 나 다음 순환 을 시작 하 겠 습 니 다. 그리고...외부 순환 을 끌 어 당 겨 다음 순환 을 시작 하 는 내부 순환 을 뛰 어 넘 을 준 비 를 하고 있 습 니 다. "너무 서 두 르 지 마 세 요. 이번 행동 을 그만 두 고 상부 의 최신 지 시 를 받 고 다음 순환 을 시작 합 니 다. 빨리 따라 오 세 요. 시간 이 촉박 합 니 다."O (∩ ∩) O 그래서 내부 순환 뒤에 기다 리 는 순환 이 이렇게 무정 하 게 버 려 졌 습 니 다. 그래서 당신 은 위의 결 과 를 보 았 습 니 다.그러나 외층 순환 은 이익 을 얻 었 다. 그의 매번 순환 은 집행 되 었 고 그 는 더욱 효율적으로 모든 것 을 완성 했다. 그래서 이것 이 바로 위 에서 말 한 것 처럼 순환 의 횟수 는 변 하지 않 았 다.
책 에서 contine N 이 실제 사용 할 때의 과정 을 동시에 제시 했다. 여기 서 나 는 바로 break 를 했다. 왜냐하면 이 사례 는 초보 자 들 이 이해 하 는 데 불리 하기 때문이다. 물론 네가 배 운 것 이 있 으 면 언제든지 이 사례 를 돌 이 켜 볼 수 있다.
contine N 구 조 는 의미 있 는 장소 에 사용 하면 이해 하기 어렵 고 기교 가 높 기 때문에 가장 좋 은 방법 은 사용 을 피 하 는 것 이다.
먼저 여기까지, O (∩ ∩) O ~
내 칼럼 주소:http://blog.csdn.net/column/details/shell-daily-study.html
계속

좋은 웹페이지 즐겨찾기