728x90

루프란 루프 제어 조건이 참인 동안에 여러 명령어들을 반복적으로 수행하는 코드 블럭입니다.

 

for 루프

 

for (in)

 

다음은 기본적인 루프문인데 C의 루프문과는 상당한 차이를 보입니다.

 

for arg in [list]

do

command...

done

list 인자에는 와일드 카드가 올 수도 있습니다.

do for와 한 줄에 쓴다면 list 뒤에 세미콜론이 있어야 합니다.

for arg in [list] ; do

 

예 10-11. C 형태의 for 루프

 

 

while

 

while은 루프 최상단에서 특정 조건을 확인하면서 그 조건이 참일 동안 루프를 계속 돌도록 해 줍니다(종료 상태 0을 리턴합니다).

while [condition]
do
command...
done

for/in 경우처럼 do를 조건 테스트문과 같은 줄에 쓰려면 세미콜론을 써 줘야 합니다.

while [condition] ; do

 

 if [ ! -e "$file" ]       # 파일이 존재하는지 확인.

-e 옵션 : 파일이 존재하면 참이므로 앞에 ! (부정을뜻하는) 연산자를 넣어줌으로써

파일이 존재하지않는다면 ~ing 이 된다.

 

for 문에서 in [list]을 안 써주면 명령어 줄에서 넘어온 인자인 $@에 대해서 동작합니다. 이런 식으로 처리하는 멋진 예제를 보려면 예 A-11를 참고하세요.

예 10-5. in [list]가 빠진 for 

예 10-6. for 문의 [list]에 명령어 치환 쓰기

이진 파일에서 일치하는 문자열 찾아내기

 

$( find $directory -type l )

 

for 

do

 command...

done | sort

 

C 형태의 문법을 쓰는 while 루프

until

 

until은 루프 최상단에서 특정 조건을 확인하면서 그 조건이 거짓일 동안 루프를 계속 돌도록 해 줍니다(while 과 반대)

 

until [condition-is-true]

do

command...

done

 

주의할 점은 until이 몇몇 프로그래밍 언어에서 비슷한 형태와는 다르게 루프 처음에서 끝내는 조건을 검사한다는 것 입니다.

for/in 경우처럼 do를 조건문과 한 줄에 같이 쓰려면 세미콜론을 적어줘야 합니다.

until [condition-is-true] ; do

예 10-17. until 루프

10.2. 중첩된 루프

중첩된 루프는 루프 안에 루프가 들어 있는 형태를 말합니다. 바깥쪽 루프의 매 단계마다 안쪽 루프를 돌리는데, 이 전체 동작은 바깥쪽 루프가 끝날 때까지 계속 됩니다. 당연한 얘기지만, 안쪽 루프나 바깥쪽 루프에서 break가 나타나면 전체 동작을 중단시킵니다.

예 10-18. 중첩된 루프

 

 

루프의 동작에 영향을 미치는 명령어들break, continue

break continue 루프 제어 명령어 [1] 는 다른 프로그래밍 언어들과 정확히 같은 동작을 합니다. break 명령어는 자신이 속해 있는 루프를 끝내고, continue는 해당 루프 사이클 내에 남아 있는 나머지 명령어들을 건너 뛰고 다음 단계의 루프를 수행합니다.

 

break 명령어는 매개변수를 받을 수도 있습니다. 매개변수 없는 break는 자신이 속해 있는 제일 안쪽 루프를 끝내지만, break N N 레벨의 루프를 빠져나갑니다.

예 10-20. 여러 단계의 루프에서 탈출하기

continue 명령어도 break와 비슷하게 매개변수를 받아 들일수 있습니다. 매개변수 없는 continue는 자신이 속한 루프의 현재 작업을 끝내고 다음번으로 건너 뛰지만 continue N은 자신이 속한 루프 레벨의 모든 단계를 건너 뛰고 N 레벨 위에 속하는 루프의 다음 단계로 건너 뜁니다.

예 10-21. 더 상위 루프 레벨에서 계속하기(continue)

case select는 코드 블럭을 반복해서 수행하지 않기 때문에 기술적으로 루프가 아닙니다. 하지만 루프가 하는 것처럼 특정 블럭의 위나 아래에서 주어진 조건에 따라 프로그램 흐름을 조정해 줍니다.

 

case (in) / esac

case는 C/C++의 switch와 동일합니다. 조건에 따라 여러개의 코드 블럭중 하나로 분기할 수 있게 해주는데, 여러개의 if/then/else의 간단한 표기법처럼 동작하기 때문에 메뉴같은 것을 만들 때 적당합니다.

 

 

case "$variable" in

"$condition1" )
command...
;;

"$condition2" )
command...
;;

 

esac

 

참고:

  • 낱말 조각남(word splitting)이 일어나지 않기 때문에 꼭 variable을 쿼우팅 하지 않아도 됩니다.
  • 각 조건들은 오른쪽 괄호, )로 끝납니다.
  • 각 조건 블럭은 이중 세미콜론, ;;.
  • 전체 case 블럭은 esac로 끝납니다(case를 거꾸로 스펠링).

* ) # 는 default 옵션

    # 그냥 리턴을 쳐도 여기로 반환

 

 

 

명령어줄 매개변수를 확인하려고 할 때, 아주 창의적인 방법으로 case를 사용하는 법을 보여 드리겠습니다.

예 10-24. case용 변수를 만들기 위해서 명령어 치환 쓰기

예 10-25. 간단한 문자열 매칭

select

select는 Korn 쉘에서 따온 것인데 메뉴를 만들때 쓸 수 있습니다.

select variable [in list]
do
command...
break
done

 

사용자가 list에 있는 것중 하나를 고를 수 있게 해 줍니다. 기본적으로 PS3(#? ) 프롬프트를 쓰고 이 값은 바꿀 수 있다는 것에 주의하기 바랍니다..

 

in list를 안 쓰면 select는 스크립트나 select를 포함하고 있는 함수로 넘어온 명령어 줄 인자($@)을 사용합니다.

in list가 빠졌을 경우를

for variable [in list]

의 경우와 비교해 보세요.

728x90

'쉘스크립트' 카테고리의 다른 글

12.~/ 외부 필터 , 프로그램 , 명령어  (0) 2022.03.04
11.~ / 내부명령어  (0) 2022.03.04
9~ / 변수 재검토  (0) 2022.03.03
8~/ 9~/ 연산자, 변수 재검토  (0) 2022.03.03
7~ 테스트  (0) 2022.03.03

+ Recent posts