고급 Bash 스 크 립 트 프로 그래 밍 가이드 (16): 순환 과 분기
9022 단어 shell
견지했어
소켓 순환
내장 순환 은 하나의 순환 에 또 하나의 순환 이 있 는 것 입 니 다. 내부 순환 은 외부 순환 체 에 있 습 니 다. 외부 순환 의 매번 실행 과정 에서 내부 순환 이 끝 날 때 까지 내부 순환 을 촉발 합 니 다. 외부 순환 이 몇 번 실 행 했 는 지 내부 순환 이 몇 번 이 되 었 는 지 내부 순환 이 든 외부 순환 의 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
계속
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ZSH에서 물고기까지ZSH는 수년 동안 내 기본 셸이었습니다. 이제 몇 달 동안 사용하면서 ZSH 구성에 대해 몇 가지 사항을 발견했습니다. 우리는 을 제공하는 시스템과 더 빨리 상호 작용하는 경향이 있습니다. 내.zshrc 구성에는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.