본문 바로가기

IT

[Ubuntu/Linux] 쉘스크립트 Flow control - while, until 문법의 모든 것

어느 언어에서나 제어문은 기초 중의 기초입니다.

쉘스크립트에도 프로그램 흐름제어를 위해 조건문과 반복문을 사용하고 있습니다.


조건에 따라 실행해야할 것과 그렇지 않은 것을 구분하는 방법을 살펴봤으니,

이제는 반복적으로 수행하는 구문을 익힐 차례입니다.


반복문은 조건문과 유사한 구문형태를 취합니다.

조건문에 익숙하다면, 반복문을 익히는데 어려움은 없을 겁니다.

 

 

while list do list done

while 구문은 위와 같은 형태를 취합니다.

list에 대해선 지난 if 문 포스팅에서 설명한 바 있습니다.


while 문에 뒤에 이어지는 조건문은,

- 사용자 입력

- 파일 입력

- 아규먼트 입력

위의 입력을 통하여 흐름을 제어하게 됩니다.


사용자 입력은 read 명령어로 얻을 수 있습니다.

read: 사용법: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

read 사용법에 적힌 마지막 [name...]은 사용자가 입력한 내용을 저장하는 변수입니다.

$ while read INPUT
> do
> echo Your input is $INPUT
> done
hello
Your input is hello

쉘에서 바로 스크립트를 입력해 보았습니다.

done까지 스크립트를 작성하고,

"hello"를 입력하니 "Your input is hello"라고 나옵니다.

read에서 false에 해당하는 값이 나오지 않는 이상 계속 사용자 입력을 기다립니다.

false는 Ctrl - D(EOF)가 입력되면 리턴됩니다.


이러한 while 문 뒤에는 연이어 다수의 명령문이 올 수 있습니다.

while echo "msg: "; read MSG
do
    echo $MSG
done

위처럼 echo와 read를 조건문으로 지정할 수 있습니다.

실제 조건문의 결과는 마지막 명령어인 read의 결과를 따릅니다.

이는 if 문에서도 마찬가지였습니다.


while 문에 파이프 '|'로 파일을 redirect하여 사용할 수 있습니다.

$ cat read.sh | while read INPUT
> do
> echo The file containes line $INPUT
> done
The file containes line #!/bin/sh
The file containes line
The file containes line while echo "msg: "; read MSG
The file containes line do
The file containes line echo $MSG
The file containes line done

위의 예제에서는 read.sh를 cat으로 읽어서 스크립트문에 표준입력하고 있습니다.

그 결과로 done 예약어 이후로 read.sh 파일 내용이 보여집니다.


echo의 결과물을 파이프로 read에 넘겨줄 수도 있습니다.

$ (echo A; echo B; echo C;) | while read INPUT
> do
> echo "Your input is $INPUT"
> done
Your input is A
Your input is B
Your input is C

echo의 결과물이 마지막 세 줄에 걸쳐 표시가 되었습니다.


done 뒤에서 파일을 입력할 수도 있습니다.

$ while read INPUT
> do
> echo "Your input is $INPUT"
> done < read.sh
Your input is #!/bin/sh
Your input is
Your input is while echo "msg: "; read MSG
Your input is do
Your input is echo $MSG
Your input is done

위의 스크립트의 마지막 줄은 done < read.sh 입니다.

read.sh의 내용을 한 줄씩 읽어들여 그 아래에 출력하고 있습니다.


조건문에 true를 입력하면 언제나 조건은 참이 됩니다.

조건문을 비워두면, 스크립트문은 에러가 나지요.

비워두는 대신 아무 것도 하지 않는다는 의미의 ':'를 넣으면 true처럼 취급됩니다.

$ while :; do echo "never stop"; done

위의 명령어를 실행하면 never stop이 영원히 출력됩니다.


while 문이 true인 경우에 반복한다면,

until문은 false인 경우에만 반복합니다.

until list do list done

위의 구문에서 list가 true가 되어야 반복을 멈추게 되죠.

while 문의 조건을 반전시킨 것과 동일하게 동작합니다.


이상으로 반복문에 대한 설명은 마치겠습니다.

그럼 좋은 하루 보내세요~

끝_


* Reference

http://www.grymoire.com/Unix/Sh.html#uh-3l